strtotime con diverse lingue?

Strtotime funziona solo nella lingua predefinita sul server? Il codice seguente dovrebbe risolversi fino all'11 agosto 2005, tuttavia utilizza il francese "aout" anziché inglese "aug".

Qualche idea su come gestirlo?

<?php $date = strtotime('11 aout 05'); echo date('d M Y',$date); ?> 

Dai documenti

Analizza qualsiasi descrizione di datetime testuale in inglese in un timestamp Unix

Come menzionato lo strtotime non tiene conto delle strtotime locali. Comunque potresti usare strptime (vedi http://ca1.php.net/manual/en/function.strptime.php ), poiché secondo i documenti:

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

Tieni presente che, a seconda del sistema, delle impostazioni internazionali e della codifica, dovrai tenere conto dei caratteri accentati.

Le date del mese francese sono:

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

Quindi, per il caso specifico in cui i mesi sono in francese è ansible utilizzare

 function myStrtotime($date_string) { return strtotime(strtr(strtolower($date_string), arrays('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'))); } 

La function comunque non si interrompe se passi $ date_string in inglese , perché non farà alcuna sostituzione.

Questo metodo dovrebbe funzionare per te usando strftime :

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

strftime

Ho scritto una semplice function in parte per risolvere questo problema. Non funziona come strtotme completo () , ma determina il numero di nomi di mesi nelle date.

 <?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) 

Allo stesso modo, possiamo procedere alla determinazione dei numbers e dei giorni della settimana, ecc.

Funzione:

 <?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; } 

La chiave per risolvere questa domanda è convertire le rappresentazioni testuali straniere nelle loro controparti inglesi. Avevo anche bisogno di questo, così ispirato dalle risposte già date che ho scritto una function bella e pulita che avrebbe funzionato per recuperare il nome del mese inglese.

 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 

Puoi regolarlo anche per i giorni della settimana.

È dipendente dalle impostazioni internazionali. Se wheresse controllare each lingua per each analisi, sarebbe SEMPRE necessario per analizzare anche le stringhe di data più semplici.

Se hai una string con un formato noto, considera l'utilizzo di date_create_from_format () , che sarà molto più efficiente e less errori di printing

Prova ad impostare la locale prima della conversione:

 setlocale(LC_TIME, "fr_FR");