php 用不同的语言?

kmynzznz  于 2023-06-04  发布在  PHP
关注(0)|答案(9)|浏览(96)

strtotime是否只能在服务器上的默认语言中工作?下面的代码应该解析到2005年8月11日,但是它使用法语“aout”而不是英语“aug”。
你知道怎么处理吗?

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

huwehgph1#

如前所述,strtotime不考虑locale。但是,您可以使用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).
请注意,根据您的系统、区域设置和编码,您必须考虑重音字符。

yvgpqqbh

yvgpqqbh2#

法国的月份是:
janvier février mars avril mai juin juillet août septembre octobre novembre dé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,函数不会中断,因为它不会做任何替换。

bfhwhh0e

bfhwhh0e3#

docs
将任何英语文本日期时间描述解析为Unix时间戳
编辑:六年过去了,关于strtotime()为什么不适合当前问题的解决方案的旁注变成了公认的答案😲
为了更好地回答这个问题,我想重复一下Marc B的回答:尽管遭到了反对,但date_create_from_format与自定义的Month解释器相结合将提供最可靠的解决方案
然而,目前看来,PHP中仍然没有内置国际日期解析的灵丹妙药。

nukf8bse

nukf8bse4#

使用strftime时,此方法应该适用:

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

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

strftime

qpgpyjmq

qpgpyjmq5#

解决这一问题的关键是将外国语篇表征转换为英语对应物。我也需要这个,所以在已经给出的答案的启发下,我写了一个很好的和干净的函数,它将用于检索英语月份名称。

function getEnglishMonthName($foreignMonthName, $setLocale='nl_NL'){
  
  $originalLocale = Locale::getDefault();
  
  setlocale(LC_ALL, 'en_US');

  $monthNumbers = range(1,12);
  
  foreach($monthNumbers as $month)
    $englishMonths[] = strftime('%B',mktime(0,0,0,$month,1,2011));
  
  setlocale(LC_ALL, $setLocale);
 
  foreach($monthNumbers as $month)
    $foreignMonths[] = strftime('%B',mktime(0,0,0,$month,1,2011));

  return str_replace($foreignMonths, $englishMonths, $foreignMonthName);

  $originalLocale = (LC_ALL, $originalLocale)
  
}

echo getEnglishMonthName('juli');
// Outputs July

您也可以针对一周中的几天以及任何其他区域设置来调整此设置。

omtl5h9j

omtl5h9j6#

我写了一个简单的函数部分解决了这个问题。它不作为完整的**strtotme()**工作,但它确定日期中月份名称的数量。

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

同样,我们可以继续确定一周中的数字和日期等。
功能:

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

fdbelqdn7#

将其添加为Marco Demaio answer的扩展版本。添加了法语星期和月份缩写:

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

qacovj5a8#

它是区域设置相关的。如果每次解析都要检查每种语言,那么即使是最简单的日期字符串也要花很长时间才能解析。
如果你有一个已知格式的字符串,可以考虑使用date_create_from_format(),这样效率更高,打印错误更少

0h4hbjxa

0h4hbjxa9#

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

setlocale(LC_TIME, "fr_FR");

相关问题