Est-ce que strtotime ne fonctionne que dans la langue par défaut sur le serveur? Le code ci-dessous devrait être corrigé jusqu'au 11 août 2005, mais il utilisera le français "aout" au lieu de l'anglais "aug".
Des idées comment gérer cela?
<?php
$date = strtotime('11 aout 05');
echo date('d M Y',$date);
?>
De la docs
Analyser n'importe quelle description textuelle date/heure en anglais dans un horodatage Unix
Edit: Six ans plus tard, et ce qui était censé être une note secondaire expliquant pourquoi strtotime () était une solution inappropriée, le problème en question est devenu la réponse acceptée ????
Pour mieux répondre à la question, je voudrais faire écho à la réponse de Marc B: malgré les votes négatifs, date_create_from_format , associé à un interpréteur de mois personnalisé fournira la solution la plus fiable.
Cependant, il semble qu'il n'y ait toujours pas de solution miracle pour l'analyse internationale des dates intégrée à PHP pour le moment.
Les dates du mois français sont:
janvier février mars mai juillet juillet juillet septembre septembre novembre décembre
Ainsi, dans le cas très particulier où les mois sont en français, vous pouvez utiliser
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 fonction ne casse quand même pas si vous passez $ date_string en anglais , car elle ne fera aucune substitution.
Comme mentionné, strtotime
ne prend pas en compte les paramètres régionaux. Cependant, vous pouvez utiliser strptime
(voir http://ca1.php.net/manual/en/function.strptime.php ), car selon la documentation:
Month and weekday names and other language dependent strings respect the current locale set with setlocale() (LC_TIME).
Notez que, selon votre système, les paramètres régionaux et le codage, vous devrez prendre en compte les caractères accentués.
Cette méthode devrait fonctionner pour vous en utilisant strftime
:
setlocale (LC_TIME, "fr_FR.utf8"); //Setting the locale to French with UTF-8
echo strftime(" %d %h %Y",strtotime($date));
J'ai écrit une fonction simple qui résout partiellement ce problème. Il ne fonctionne pas comme un strtotme () complet, mais il détermine le nombre de noms de mois dans les dates.
<?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)
De même, nous pouvons procéder pour déterminer les nombres et les jours de la semaine, etc.
Une fonction:
<?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 solution pour résoudre cette question consiste à convertir les représentations textuelles étrangères en leurs équivalents anglais. J'avais aussi besoin de ça, tellement inspiré par les réponses déjà données que j'ai écrit une fonction Nice and clean qui permettrait de retrouver le nom du mois en anglais.
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
Vous pouvez également l’ajuster pour les jours de la semaine et pour tout autre lieu.
Ajouter ceci en tant que version étendue de Marco Demaio answer . Ajout des abréviations des jours de la semaine et des mois français:
<?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',
]
)
);
}