strtotime用不同的语言?

strtotime只能在服务器上使用默认的语言吗? 下面的代码应该解决到2005年8月11日,但是它使用法语“aout”而不是英文“aug”。

任何想法如何处理?

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

从文档

将任何英文文本date时间描述parsing为Unix时间戳

如上所述,时间不考虑区域设置。 但是,您可以使用strptime (请参阅http://ca1.php.net/manual/en/function.strptime.php ),因为根据文档:

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

请注意,取决于您的系统,区域设置和编码,您必须考虑重音字符。

法文月份date是:

janvierfévriermars avril mai juin juilletaoûtseptembre octobre novembredécembre

因此,对于法语月份的特定情况,您可以使用

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

如果你在英文中传递$ date_string,函数不会中断 ,因为它不会做任何replace。

这个方法应该适用于你使用strftime

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

的strftime

我写了一个简单的函数,部分解决了这个问题。 它不能作为一个完整的strtotme() ,但它决定了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) 

同样,我们可以继续确定一周中的数字和天数等。

function:

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

解决这个问题的关键是把外国的文字expression方式转换成英文的expression方式。 我也需要这个,从已经给出的答案中得到灵感,我写了一个很好的,干净的函数来检索英文月份名称。

 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 

您也可以在一周中的某几天进行调整。

它依赖于语言环境。 如果必须检查每个语言的每一个parsing,那么即使是最简单的datestring也要花费很长时间才能parsing。

如果你已经有了一个已知格式的string,可以考虑使用date_create_from_format() ,这样会更高效,更less错误打印

尝试在转换之前设置区域设置:

 setlocale(LC_TIME, "fr_FR");