2013-03-04 189 views
0

Symfony 2在自己的DateTimeToLocalizedStringTransformer 中使用了intlDateFormatter,但无法正常工作。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

我得到这个:

<?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 Московское стандартное время 
+0

因此,我如何更新ICU数据? 是这样的? http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data 或简单的重新安装libicu最新版本? libicu48例如 – versh23 2013-03-09 08:58:32

+0

@ user1747168您可以遵循该过程,但要注意的是,如果您的软件包管理器管理libicu,则可能会在更新时重写数据。如果您想更新ICU,则必须重新编译PHP intl扩展(例如,通过重新安装pecl)。 – Artefacto 2013-03-09 15:55:40