PHP DateTime 差异返回错误的天数

Ask*_*man 3 php php-7.2

我有以下代码,它打印出两个日期之间的差异:

print_r((new DateTime('2018-01-01'))->diff(new DateTime('2018-11-01')));

print_r((new DateTime('2018-10-01'))->diff(new DateTime('2018-11-01')));
Run Code Online (Sandbox Code Playgroud)

输出:

DateInterval Object
(
    [y] => 0
    [m] => 10
    [d] => 0
    [h] => 0
    [i] => 0
    [s] => 0
    [f] => 0
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 304
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)
DateInterval Object
(
    [y] => 0
    [m] => 1
    [d] => 1
    [h] => 0
    [i] => 0
    [s] => 0
    [f] => 0
    [weekday] => 0
    [weekday_behavior] => 0
    [first_last_day_of] => 0
    [invert] => 0
    [days] => 31
    [special_type] => 0
    [special_amount] => 0
    [have_weekday_relative] => 0
    [have_special_relative] => 0
)
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个日期差异正确返回 10 个月零 0 天。然而,第二个不是返回 1 个月 0 天,而是错误地返回 1 个月零 1 天。

这是什么原因造成的?

令我困惑的是,我试图在几个 PHP 沙盒站点上运行此代码,但得到的结果不一致:

我自己的服务器和https://wtools.io/php-sandbox为第二个日期返回错误的天数。但例如http://sandbox.onlinephpfunctions.com/在第二个日期差异时正确返回 0 天。

del*_*8uk 5

这是因为服务器时区。只需将所有内容都设置为 UTC,您应该没问题。

print_r((new DateTime('2018-10-01', new DateTimeZone('UTC')))->diff(new DateTime('2018-11-01', new DateTimeZone('UTC'))));
Run Code Online (Sandbox Code Playgroud)

https://3v4l.org/PWKiD

没有时区,确实是意想不到的值。https://3v4l.org/6v0XI

  • 我*认为*这是因为夏令时......时钟回到十月,这意味着十月一日的午夜比十一月一日的午夜早一个小时 - 而且因为*时间*没有在那些中指定`DateTime` 对象......这就是 `UTC` 修复有效的原因。将时间设置为中午(`2018-11-01 12:00:00`)也解决了这个问题。 (2认同)