【发布时间】:2017-05-28 03:00:18
【问题描述】:
您好,我对 PHP 的 DateTime 有疑问。
考虑以下脚本:
date_default_timezone_set("Europe/Paris");
echo $tz = date_default_timezone_get();
echo "\n";
$dt = new \DateTime("2017-10-29 00:00:00");
$i = (int)$dt->format('U');
$i_max = $i + 3600*5;
for(; $i < $i_max ; $i+=3600){
$dt = new \DateTime();
$dt->setTimezone(new \DateTimeZone($tz));
$dt->setTimestamp($i);
echo $i."\n";
echo $dt->format('c T e')."\n";
echo date('c T e', $i)."\n";
echo "\n";
}
它在 5 个“小时”时间戳之间循环,直到 10 月法国夏令时。 然后它会显示 ISO8601 中的日期及其时区标识符和缩写。
结果如下:
Europe/Paris
1509228000
2017-10-29T00:00:00+02:00 CEST Europe/Paris
2017-10-29T00:00:00+02:00 CEST Europe/Paris
1509231600
2017-10-29T01:00:00+02:00 CEST Europe/Paris
2017-10-29T01:00:00+02:00 CEST Europe/Paris
1509235200
2017-10-29T02:00:00+01:00 CET Europe/Paris
2017-10-29T02:00:00+02:00 CEST Europe/Paris
1509238800
2017-10-29T02:00:00+01:00 CET Europe/Paris
2017-10-29T02:00:00+01:00 CET Europe/Paris
1509242400
2017-10-29T03:00:00+01:00 CET Europe/Paris
2017-10-29T03:00:00+01:00 CET Europe/Paris
查看第 3 次迭代,DateTime->format() 和 date() 之间的结果不同。
日期时间显示:
2017-10-29T02:00:00+01:00 CET 欧洲/巴黎
但它应该显示与 date() 相同的内容:
2017-10-29T02:00:00+02:00 CEST 欧洲/巴黎
我的错在哪里??
--编辑--
嗨,这是另一个直接指向“错误”的脚本:
date_default_timezone_set("Europe/Paris");
$dt = new \DateTime();
$dt->setTimestamp(1509235200);
echo $dt->format('c T e')."\n";
echo date('c T e', 1509235200)."\n";
显示:
2017-10-29T02:00:00+01:00 CET Europe/Paris
2017-10-29T02:00:00+02:00 CEST Europe/Paris
并且应该显示:
2017-10-29T02:00:00+02:00 CEST Europe/Paris
2017-10-29T02:00:00+02:00 CEST Europe/Paris
【问题讨论】:
-
为什么不使用 DateInterval,并使用 DateTime 对象和句点,而不是使用 UTC 且不支持 DTS 的 unix 时间戳
-
我正在尝试建模一种在 mysql 中存储 datetime+dst 数据的方法,但我发现了这个错误。该循环仅用于示例目的。我不明白为什么 DateTime 和 date() 的行为不同。
-
在这段代码之后'$i = $dt->format('U');'执行时,$i 是一个字符串,然后你把它当作一个数字来使用,所以你会得到意想不到的结果。
-
$tz 设置在哪里?
-
vascowhite:我更正了脚本的开头并为格式('U')添加了一个(int)强制转换,不幸的是没有任何改变。