【问题标题】:PHP with IntlDateFormatterPHP 与 IntlDateFormatter
【发布时间】:2015-04-05 12:45:53
【问题描述】:

有一个脚本:

for($i=80; $i<=89; $i++)
{
    $date = '01.04.19'.$i;
    $intlDateFormatter = new \IntlDateFormatter('ru', 2, -1, 'Europe/Moscow', 1, 'dd.MM.yyyy');
    $intlDateFormatter->setLenient(false);
    $timestamp = $intlDateFormatter->parse($date);
    echo $date . ' = ' . var_export($timestamp, 1);
    echo '<br>' . PHP_EOL;
}

脚本输出:

01.04.1980 = 323384400
01.04.1981 = false
01.04.1982 = false
01.04.1983 = false
01.04.1984 = false
01.04.1985 = 481147200
01.04.1986 = 512683200
01.04.1987 = 544219200
01.04.1988 = 575841600
01.04.1989 = 607377600

日期有什么问题:01.04.1981、01.04.1982、01.04.1983、01.04.1984? PHP 5.5.9-1

【问题讨论】:

  • 它只在这个时区失败,并且 lenient 设置为false。但仍然不知道为什么... ;-)
  • 真的很奇怪,好像你评论$intlDateFormatter-&gt;setLenient(false);这行一样有效,但我不知道为什么......
  • 这是 Symfony 的创意解决方案

标签: php intl


【解决方案1】:

为了解决问题,需要使用UTC。

在 Symfony 的 2.1.* 案例中:

    'data_timezone' => 'UTC',
    'user_timezone' => 'UTC',

Symfony 2.3+:

    'model_timezone' => 'UTC',
    'view_timezone' => 'UTC',

【讨论】:

    【解决方案2】:

    我认为这是因为那些年莫斯科在 4 月 1 日改为夏令时,所以 00:00:00 和 00:01:00 之间的时间不存在。 1985 年他们提前一天改变了,而 1980 年他们根本没有改变

    您可以在以下位置查看时间/日期更改的详细信息; http://www.timeanddate.com/time/change/russia/moscow?year=1982

    【讨论】:

    • 在此基础上,解决方法是将时区设置为UTC
    猜你喜欢
    • 2012-09-18
    • 2017-01-18
    • 2020-09-05
    • 2012-03-18
    • 2015-11-26
    • 2013-02-18
    • 1970-01-01
    • 2015-01-02
    • 2015-09-05
    相关资源
    最近更新 更多