You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同时区下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:45:19