strtotime mit verschiedenen Sprachen?

functioniert strtotime nur in der Standardsprache auf dem Server? Der untenstehende Code sollte auf den 11. August 2005 lauten, allerdings verwendet er den französischen “aout” anstelle des englischen “aug”.

Irgendwelche Ideen, wie man damit umgeht?

 

    Aus den Dokumenten

    Analysieren Sie jede englische Textdatumsbeschreibung in einen Unix-Zeitstempel

    Edit: Nun, sechs Jahre später, und was als eine Nebenbemerkung dazu gedacht war, warum strtotime () eine unangemessene Lösung für das vorliegende Problem war, wurde zur akzeptierten Antwort 😲

    Um die eigentliche Frage besser zu beantworten, möchte ich die Antwort von Marc B wiederholen: Trotz der Downvotes bietet date_create_from_format gepaart mit einem benutzerdefinierten Month-Interpreter die zuverlässigste Lösung

    Es sieht jedoch so aus, als ob es noch kein Silver-Bullet für das in PHP integrierte internationale Datums-Parsing gibt.

    Wie bereits erwähnt, strtotime das Gebietsschema nicht. Allerdings könnte man strptime (siehe http://ca1.php.net/manual/en/function.strptime.php ), da laut den Dokumenten:

    Month and weekday names and other language dependent strings respect the current locale set with setlocale() (LC_TIME).

    Beachten Sie, dass Sie je nach System, Gebietsschema und Kodierung Zeichen mit Akzent berücksichtigen müssen.

    Französische Monatsdaten sind:

    janvier février mars avril mai juin juillet août septembre octobre novembre décembre

    Also, für den ganz speziellen Fall, wo Monate in Französisch sind, könnten Sie verwenden

     function myStrtotime($date_string) { return strtotime(strtr(strtolower($date_string), array('janvier'=>'jan','février'=>'feb','mars'=>'march','avril'=>'apr','mai'=>'may','juin'=>'jun','juillet'=>'jul','août'=>'aug','septembre'=>'sep','octobre'=>'oct','novembre'=>'nov','décembre'=>'dec'))); } 

    Die function bricht sowieso nicht ab, wenn Sie $ date_string auf Englisch übergeben , weil sie keine Substitution durchführt.

    Diese Methode sollte für Sie mit strftime :

     setlocale (LC_TIME, "fr_FR.utf8"); //Setting the locale to French with UTF-8 echo strftime(" %d %h %Y",strtotime($date)); 

    strftzeit

    Ich habe eine einfache function geschrieben, die dieses Problem teilweise triggers. Es funktioniert nicht als vollständiges strtotme () , sondern bestimmt die Anzahl der Monatsnamen in den Daten.

     < ?php // For example, I get the name of the month from a // date "1 January 2015" and set him (with different languages): echo month_to_number('January').PHP_EOL; // returns "01" (January) echo month_to_number('Января', 'ru_RU').PHP_EOL; // returns "01" (January) echo month_to_number('Мая', 'ru_RU').PHP_EOL; // returns "05" (May) echo month_to_number('Gennaio', 'it_IT').PHP_EOL; // returns "01" (January) echo month_to_number('janvier', 'fr_FR').PHP_EOL; // returns "01" (January) echo month_to_number('Août', 'fr_FR').PHP_EOL; // returns "08" (August) echo month_to_number('Décembre', 'fr_FR').PHP_EOL; // returns "12" (December) 

    In ähnlicher Weise können wir fortfahren, die Nummern und Wochentage usw. zu bestimmen.

    function:

     < ?php function month_to_number($month, $locale_set = 'ru_RU') { $month = mb_convert_case($month, MB_CASE_LOWER, 'UTF-8'); $month = preg_replace('/я$/', 'й', $month); // fix for 'ru_RU' $locale = setlocale(LC_TIME, '0'); setlocale(LC_TIME, $locale_set.'.UTF-8'); $month_number = FALSE; for ($i = 1; $i <= 12; $i++) { $time_month = mktime(0, 0, 0, $i, 1, 1970); $short_month = date('M', $time_month); $short_month_lc = strftime('%b', $time_month); if (stripos($month, $short_month) === 0 OR stripos($month, $short_month_lc) === 0) { $month_number = sprintf("%02d", $i); break; } } setlocale(LC_TIME, $locale); // return locale back return $month_number; } 

    Der Schlüssel zur Lösung dieser Frage ist die Konvertierung von fremdsprachlichen Darstellungen in ihre englischen Pendants. Ich brauchte das auch, so inspiriert von den bereits gegebenen Antworten, schrieb ich eine nette und saubere function, die zum Abrufen des englischen Monatsnamens funktionieren würde.

     function getEnglishMonthName($foreignMonthName,$setlocale='nl_NL'){ setlocale(LC_ALL, 'en_US'); $month_numbers = range(1,12); foreach($month_numbers as $month) $english_months[] = strftime('%B',mktime(0,0,0,$month,1,2011)); setlocale(LC_ALL, $setlocale); foreach($month_numbers as $month) $foreign_months[] = strftime('%B',mktime(0,0,0,$month,1,2011)); return str_replace($foreign_months, $english_months, $foreignMonthName); } echo getEnglishMonthName('juli'); // Outputs July 

    Sie können dies auch für Wochentage und für jedes andere Gebietsschema anpassen.

    Hinzufügen dieser als erweiterte Version von Marco Demaio Antwort . Französische Wochentage und Monate Abkürzungen hinzugefügt:

     < ?php public function frenchStrtotime($date_string) { $date_string = str_replace('.', '', $date_string); // to remove dots in short names of months, such as in 'janv.', 'févr.', 'avr.', ... return strtotime( strtr( strtolower($date_string), [ 'janvier'=>'jan', 'février'=>'feb', 'mars'=>'march', 'avril'=>'apr', 'mai'=>'may', 'juin'=>'jun', 'juillet'=>'jul', 'août'=>'aug', 'septembre'=>'sep', 'octobre'=>'oct', 'novembre'=>'nov', 'décembre'=>'dec', 'janv'=>'jan', 'févr'=>'feb', 'avr'=>'apr', 'juil'=>'jul', 'sept'=>'sep', 'déc'=>'dec', 'lundi' => 'monday', 'mardi' => 'tuesday', 'mercredi' => 'wednesday', 'jeudi' => 'thursday', 'vendredi' => 'friday', 'samedi' => 'saturday', 'dimanche' => 'sunday', ] ) ); } 

    Es hängt vom Gebietsschema ab. Wenn es jede Sprache für jede Syntaxanalyse prüfen müsste, würde es beinahe FOREVER dauern, selbst die einfachsten Datenfolgen zu parsen.

    Wenn Sie eine Zeichenkette mit bekanntem Format haben, sollten Sie date_create_from_format () in Betracht ziehen , da dies wesentlich effizienter und weniger errorsträchtig ist

    Versuchen Sie, das Gebietsschema vor der Konvertierung festzulegen:

     setlocale(LC_TIME, "fr_FR");