【问题标题】:intlDateFormatter summer timeintlDateFormatter 夏令时
【发布时间】:2013-02-18 10:36:51
【问题描述】:

Symfony 2 在自己的 DateTimeToLocalizedStringTransformer 中使用 intlDateFormatter 但不能正常工作。

$tz = new DateTimeZone('Europe/Moscow');
$date = new DateTime('1 march', $tz);


echo "PHP: " . phpversion() . "<br/>\n";
echo "Intl: " . phpversion('intl') . "<br/>\n";
echo "<br/>\n";

echo "TZ: " . $tz->getName() . "<br/>\n";

echo "Native:<br/>\n";
echo $date->format('H:i:s d.m.Y');
echo "<br/>\n";


echo "Intl:<br/>\n";
$formatter = new IntlDateFormatter('RU_ru', IntlDateFormatter::FULL, IntlDateFormatter::FULL, $tz->getName());
echo $formatter->format($date);
echo "\n";

我有结果

PHP: 5.3.22-1~dotdeb.0
Intl: PECL-2.0.1
TZ: Europe/Moscow

Native:
00:00:00 01.03.2013
Intl:
28 february 2013 23:00:00

我试试

pecl install timezonedb
pecl install intl

并重新安装 libicu44

【问题讨论】:

    标签: php datetime symfony intl


    【解决方案1】:

    我明白了:

    <?php
    $tz = new DateTimeZone('UTC');
    $date = new DateTime('1 march', $tz);
    
    echo "ICU data version: ", INTL_ICU_DATA_VERSION, "\n";
    $formatter = new IntlDateFormatter('RU_ru', IntlDateFormatter::FULL,
            IntlDateFormatter::FULL, "Europe/Moscow");
    echo $formatter->format($date), "\n";
    
    ICU数据版本:4.4.0.1 пятница,2013 年 1 月 1 日。 3:00:00 Московское стандартное время

    这是错误的,因为莫斯科现在全年都是 UTC+4。然而,这是一个相当新的发展(他们几年前才放弃 DST),因此 ICU 数据太旧而无法反映这一点。如果您使用更新版本的 ICU 进行测试,您会得到正确的结果:

    ICU数据版本:49.1 пятница, 2013 年 1 月 4:00:00 Московское стандартное время

    【讨论】:

    • 那么,如何更新 ICU 数据?像这样? userguide.icu-project.org/datetime/… 或者简单地用最新版本重新安装 libicu ?以 libicu48 为例
    • @user1747168 您可以按照该程序进行操作,但请注意,如果您的包管理器管理 libicu,则数据可能会在更新时被重写。如果您想更新 ICU,则必须重新编译 PHP intl 扩展(例如通过重新安装 pecl)。
    猜你喜欢
    • 2011-02-22
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2012-04-07
    • 2012-10-23
    • 2017-03-14
    相关资源
    最近更新 更多