我很难理解我的代码如何适应DST,因为它与最近的更新不正确。我在数据库中存储基于UTC的日期时间,然后将其转换回本地时区以供显示。如果PHP考虑了夏令时,那么其他地方就有问题了,因为我存储的所有日期都有1小时的误差。
$stored_date = '2016-11-16 12:04:01'; // in UTC
$dateTime = new DateTime($stored_date, new DateTimeZone('UTC'));
$dateTimeZone = new DateTimeZone('America/New_York');
$dateTime->setTimezone($dateTimeZone);
print_r($dateTime);
上周,在DST结束之前,这将打印出2016-11-16 08:04:01。本周,夏时制已经结束,它打印出2016-11-16 07:04:01。如果PHP正确地处理DST转换,为什么会有小时差异?
服务器设置应该无关紧要(我不认为)因为我在PHP中显式地进行转换,对吧?
我已经准备好开始用PHP检查,看看DST是否有效,并抵消1小时的转换,因为我不知道为什么这个小时没有在DateTime类内自动补偿。
纽约市在这些时区之间切换:
- 冬季:EST(东部标准时间)= UTC -5
- 夏季:EDT(东部夏令时)= UTC -4
根据timeanddate.com,这个转换将在11月6日发生。因此结果是正确的:12 - 5 = 7
换句话说,PHP完全知道DST,正如我们在下面的代码中看到的:
$dateTime = new DateTime('2016-11-05 12:04:01', new DateTimeZone('UTC'));
$dateTime->setTimezone(new DateTimeZone('America/New_York'));
echo $dateTime->format('r') . PHP_EOL;
$dateTime = new DateTime('2016-11-06 12:04:01', new DateTimeZone('UTC'));
$dateTime->setTimezone(new DateTimeZone('America/New_York'));
echo $dateTime->format('r') . PHP_EOL;
Sat, 05 Nov 2016 08:04:01 -0400
Sun, 06 Nov 2016 07:04:01 -0500
您可以查看系统时间数据库中可用的确切信息:
$timeZone = new DateTimeZone('America/New_York');
print_r($timeZone->getTransitions(mktime(0, 0, 0, 1, 1, 2016), mktime(0, 0, 0, 12, 31, 2016)));
Array
(
[0] => Array
(
[ts] => 1451602800
[time] => 2015-12-31T23:00:00+0000
[offset] => -18000
[isdst] =>
[abbr] => EST
)
[1] => Array
(
[ts] => 1457852400
[time] => 2016-03-13T07:00:00+0000
[offset] => -14400
[isdst] => 1
[abbr] => EDT
)
[2] => Array
(
[ts] => 1478412000
[time] => 2016-11-06T06:00:00+0000
[offset] => -18000
[isdst] =>
[abbr] => EST
)
)