$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版本
答案 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
天" (m
和d
属性),总共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天" ,两个都是正确和错误的同时。
"一个月" 的定义是什么?它可以是28
和31
天之间的任何值。这意味着," 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的评论,否则这个答案看起来很短; - )