PHP日期差异错误

时间:2017-07-14 11:25:52

标签: php datetime

$startDate = new DateTime("2016-06-01");
$endDate = new DateTime("2016-06-30");
$diff = date_diff($startDate,$endDate);
$differenceYear = $diff->format("%y");
$differenceMonth = $diff->format("%m");
$difference = $differenceYear*12 + $differenceMonth;
echo $difference;

上面的代码将输出0作为结果。但是,当我将这两个日期更改为2016-12-01和2016-12-31时,代码将1作为输出。为什么会这样?

当我检查这个代码在线php编辑器时,它给出了正确的答案。但当我将它复制到我的本地机器时,答案显示错误。在线编辑器 US / Pacific 作为时区。我的电脑有亚洲/加尔各答时区。两者都有相同的PHP版本

2 个答案:

答案 0 :(得分:3)

使用我的默认时区(Europe/Bucharest),print_r($diff)会产生:

DateInterval Object
(
    [m] => 1
    [d] => 0
    [days] => 30
)
# I removed the other components as they are irrelevant to the question
# and they are 0 anyway.

这意味着:" 1月和0天" (md属性),总共30天(days属性)。

使用Asia/Kolkata作为默认时区:

DateInterval Object
(
    [m] => 0
    [d] => 30
    [days] => 30
)
# Again, all the other object properties are 0 and irrelevant for the question

这意味着:" 0个月和30天",30天。

如您所见,总天数(days属性)相同(30)且正确无误。

关于" 1个月和0天" " 0个月和30天" ,两个都是正确和错误的同时。

"一个月" 的定义是什么?它可以是2831天之间的任何值。这意味着," 1个月和0天" 等于" 0个月和28天" &# 34; 0个月和29天" aso 同时

问题标题为" PHP日期差异错误" - PHP日期差异没有错误。它只是人类语言和文化中"month"一词的宽松定义。

答案 1 :(得分:1)

这是一个时区问题。我建议您从日期字符串(例如2016-12-01 00:00:00 +00:00)创建DateTime对象,这样您将始终使用UTC。

$startDate = new DateTime("2016-12-01  00:00:00 +00:00");
$endDate = new DateTime("2016-12-31  00:00:00 +00:00"); 
$diff = date_diff($startDate,$endDate);
$differenceYear = $diff->format("%y");
$differenceMonth = $diff->format("%m");
var_dump($differenceYear,$differenceMonth);
$difference = $differenceYear*12 + $differenceMonth;
echo $difference;

(代码取自Xatenev的评论,否则这个答案看起来很短; - )