2011-08-08 13 views
20

¿Strtotime solo funciona en el idioma predeterminado en el servidor? El siguiente código debe resolverse al 11 de agosto de 2005, sin embargo, utiliza el francés "aout" en lugar del inglés "aug".strtotime ¿Con diferentes idiomas?

¿Alguna idea de cómo manejar esto?

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

Respuesta

7

Desde el docs

Analizar cualquier descripción textual de fecha y hora Inglés en un Unix marca de tiempo

+1

Esta debería ser la respuesta aceptada. – Spir

+21

No responde la pregunta "¿Alguna idea de cómo manejar esto?" –

+5

No atiende la pregunta – onassar

-4

intenta establecer la configuración regional antes de la conversión:

setlocale(LC_TIME, "fr_FR"); 
-3

Es dependiente de la localidad Si tuviera que verificar todos los idiomas para cada análisis, tomaría casi FOREVER analizar incluso las cadenas de fecha más simples.

Si usted tiene una cadena con formato conocido, considere el uso de date_create_from_format(), which'll ser errores de impresión mucho más eficiente y menos

+0

Esto está mal. DateTime no analizará datos que no sean en inglés. es decir, esto fallará: setlocale (LC_TIME, "fr_FR"); $ dt = DateTime :: createFromFormat ('d F Y', "12 Août 2013"); – Spir

9

Como se ha mencionado strtotime no toma en cuenta la configuración regional. Sin embargo, usted podría utilizar strptime (ver http://ca1.php.net/manual/en/function.strptime.php), ya que de acuerdo a los documentos:

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

Tenga en cuenta que dependiendo de su sistema, la configuración regional y la codificación tendrá que dar cuenta de los caracteres acentuados.

+0

También tenga en cuenta en los documentos que: _Esta función no está implementada en plataformas Windows_, que esta función puede tener un comportamiento diferente en diferentes sistemas operativos y que necesita al menos php 5.1. – PhoneixS

9

fechas franceses mes son: estropea février

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

Por lo tanto, para el caso muy específico en el mes están en francés se podría utilizar

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'))); } 

La función de todos modos no se rompe si pasa $ da te_string en inglés, porque no hará ninguna sustitución.

7

Este método debería funcionar para usted, utilizando strftime:

setlocale (LC_TIME, "fr_FR.utf8"); //Setting the locale to French with UTF-8 

echo strftime(" %d %h %Y",strtotime($date)); 

strftime

4

escribí una función simple resuelve en parte este problema. No funciona como un strtotme completo(), pero determina la cantidad de meses de nombres en las fechas.

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

Del mismo modo, podemos proceder a determinar los números y días de la semana, etc.

Función:

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

La clave para resolver esta cuestión es la de convertir representaciones textuales extranjeros a sus homólogos ingleses. También lo necesitaba, así que, inspirado por las respuestas ya dadas, escribí una función agradable y limpia que funcionaría para recuperar el nombre del mes en inglés.

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 

También puede ajustar esto para los días de la semana.

+0

Después de pasarle una cadena de fecha completa descubrí que puede reemplazar el nombre del mes y reemplazar el nombre del día en la misma función. –

0

Agregando esto como una versión extendida de Marco Demaio answer. Se agregaron días de la semana y abreviaturas de los meses:

<?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', 
     ] 
    ) 
); 
} 
Cuestiones relacionadas