intlDateFormatter夏令时

时间:2013-03-04 10:54:52

标签: php datetime symfony intl

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

1 个答案:

答案 0 :(得分: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 data version: 4.4.0.1
пятница, 1 марта 2013 г. 3:00:00 Московское стандартное время

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

ICU data version: 49.1
пятница, 1 марта 2013 г., 4:00:00 Московское стандартное время