我有以下代码:
<?php
function dateIsDST ($timestamp=null, $timezone=null) {
if (is_null($timestamp) && is_null($timezone)) {
$date = new DateTime('@'.time());
}
else {
$date = new DateTime('@'.$timestamp, new DateTimeZone($timezone));
}
echo $date->format('Y-m-d H:i:sP');
echo '---';
// date("I") returns 1 in summer and 0 in winter
var_dump ($date->format('I'));
}
dateIsDST(1648961437, 'America/New_York');
dateIsDST(1644861437, 'America/New_York');
但当它应该返回1(对于第一个方法调用(时,总是返回0。
2022-08-08 12:23:57+00:00---string(1) "0" // should be 1
2022-02-14 17:57:17+00:00---string(1) "0"
我做错了什么:
如果使用时间戳实例化DateTime
,则会忽略时区。修复方法很简单。在函数中实例化后,用->setTimeZone
设置时区
$date->setTimeZone(new DateTimeZone($timezone));
结果:
2022-04-03 00:50:37-04:00---string(1) "1"
2022-02-14 12:57:17-05:00---string(1) "0"
如需参考,请参阅关于DateTime::__construct:的PHP手册
当
$datetime
参数是UNIX时间戳(例如@946684800(或指定时区(例如2010-01-28T15:00:00+02:00(时,$timezone
参数和当前时区将被忽略。
之所以会发生这种情况,是因为Unix时间戳总是以UTC为单位——而且为了进行DateTime解析,这与在时间字符串中指定时区相同(=TZ参数被忽略(。