同时区下PHP DateTime::diff计算日期为何年份差有1年差异?
为什么Europe/Rome时区下两个日期差的计算结果不一致?
问题代码
$a = new DateTime("2023-05-31", new DateTimeZone('Europe/Rome')); $b = new DateTime("1970-05-31", new DateTimeZone('Europe/Rome')); var_dump($a->diff($b)->y); // int(52) $a = new DateTime("2023-05-30", new DateTimeZone('Europe/Rome')); $b = new DateTime("1970-05-30", new DateTimeZone('Europe/Rome')); var_dump($a->diff($b)->y); // int(53)
疑问:为何第一段代码的年份差为52?预期两段结果均为53。
原因解析
核心问题出在Europe/Rome时区的历史夏令时调整:
- 1970年5月31日当天,意大利执行夏令时切换,时钟直接从5月30日的23:00:00跳到了5月31日的01:00:00,也就是说
1970-05-31 00:00:00这个时间点在Europe/Rome时区中是不存在的。 - 当PHP创建
new DateTime("1970-05-31", new DateTimeZone('Europe/Rome'))时,会自动将这个无效时间调整为1970-05-31 01:00:00 CEST。 - 而
2023-05-31 00:00:00 CEST是有效的时间点,两者的时间差为52年364天23小时,不足完整的53年,因此diff()->y返回52。 - 反观5月30日:
1970-05-30 00:00:00是有效时间,和2023-05-30 00:00:00的间隔刚好是53年整,所以返回53。
内容的提问来源于stack exchange,提问作者user22001584
相关产品推荐
相关产品推荐

