2011-08-08 14 views
20

Czy strtotime działa tylko w domyślnym języku na serwerze? Poniższy kod powinien zostać rozwiązany do 11 sierpnia 2005, jednak używa angielskiego "aout" zamiast angielskiego "aug".strtotime w różnych językach?

Jakieś pomysły, jak sobie z tym poradzić?

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

Odpowiedz

7

Z docs

Parsuje angielskich tekstowych opisów daty w Unix datownik

+1

To powinna być zaakceptowana odpowiedź. – Spir

+21

Nie odpowiada na pytanie "Jakieś pomysły, jak sobie z tym poradzić?" –

+5

Nie odpowiada na pytanie – onassar

-4

spróbuj ustawić ustawienia regionalne przed konwersją:

setlocale(LC_TIME, "fr_FR"); 
-3

To zależne od ustawień regionalnych. Jeśli musiałby sprawdzać każdy język dla każdego parsowania, prawie na zawsze musiałby parsować nawet najprostsze ciągi dat.

Jeśli masz ciąg ze znanym formacie, należy rozważyć użycie date_create_from_format(), which'll być znacznie bardziej wydajne i mniej błędów druku

+0

To jest złe. DateTime nie będzie parsować danych innych niż angielski. to się nie powiedzie: setlocale (LC_TIME, "fr_FR"); $ dt = DateTime :: createFromFormat ('d F Y', "12 Août 2013"); – Spir

9

Jak wspomniano strtotime locale nie bierze pod uwagę. Jednakże można użyć strptime (patrz http://ca1.php.net/manual/en/function.strptime.php), ponieważ zgodnie z docs:

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

Należy pamiętać, że w zależności od systemu, lokalizacji i kodowania trzeba będzie wyjaśnić znaków akcentowanych.

+0

Należy również pamiętać, że z dokumentacji wynika, że: _Ta funkcja nie jest zaimplementowana na platformach Windows_, że ta funkcja może mieć inne zachowanie w różnych systemach operacyjnych i potrzebujesz przynajmniej php 5.1. – PhoneixS

9

francuski Daty miesiąc to:

Janvier Mars Fevrier Avril mai juin juillet août septembre octobre Novembre décembre

Stąd dla bardzo szczególnym przypadku, gdy miesiąc są w języku francuskim można użyć

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

Funkcja mimo to nie pęka, jeśli przekażesz $ da te_string po polsku, ponieważ nie spowoduje żadnej zmiany.

7

Ta metoda powinna działać dla używasz strftime:

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

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

strftime

4

napisałem prostą funkcją częściowo rozwiązuje ten problem. To nie działa jako pełna strtotme(), ale określa liczbę miesięcy nazw w datach.

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

Podobnie możemy przystąpić do ustalenia liczby i dni tygodnia itp.

Funkcja:

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

Kluczem do rozwiązania tej kwestii jest konwersja zagraniczne reprezentacje tekstowe do swoich odpowiedników angielskich. Też potrzebowałem tego, zainspirowany odpowiedziami, które już napisałem, napisałem ładną i czystą funkcję, która zadziałałaby przy pobieraniu nazwy miesiąca angielskiego.

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 

Można to również dostosować na dni tygodnia.

+0

Po przejściu do niego pełnego ciągu daty, dowiedziałem się, że możesz zastąpić nazwę miesiąca i zastąpić nazwę dnia w tej samej funkcji. –

0

Dodanie tego jako rozszerzonej wersji Marco Demaio answer. Dodano francuskie dni tygodnia i miesięcy skróty:

<?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', 
     ] 
    ) 
); 
} 
Powiązane problemy