web-dev-qa-db-fra.com

strtotime avec différentes langues?

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);
?>
23
Cory Dee

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.

8
Mr Griever

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.

10
Marco Demaio

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.

9
Technoh

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

strftime

7
Rashad

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;
}
4
DmitryS

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.

2
Ogier Schelvis

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',
      ]
    )
  );
}
0
Dmytro Sukhovoy