2017-07-14 143 views
4
$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日期差误差

当我检查这个代码在网上PHP编辑它给出了正确的答案。但是当我将它复制到本地机器时,答案显示错误。在线编辑器有美国/太平洋地区作为时区。我的电脑有亚洲/加尔各答时区。这两个具有相同的PHP版本

+1

代码输出'1'我。你使用哪个PHP版本? – modsfabio

+0

@modsfabio它关于时区兄弟.. – Xatenev

+1

亲爱的六月份只有30天,你通过2016-06-31,这就是为什么你会得到错误 –

回答

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的评论采取的代码,否则这个答案看起来很短;-)

+1

https://3v4l.org/Hj57H这可能会更好地显示差异。 – Xatenev

+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属性),在总(该days属性)30天。

使用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个月和28天”,“0个月和29天” a.s.o. 在同一时间


问题题曰“PHP的时间差错误” - 没有在PHP的时间差没有错误。这只是人类语言和文化中术语"month"的松散定义。

+0

那么我应该如何使用答案。但事情是同一时期给了我错误的答案。 ** 2016-06-01 **和** 2016-06-30 **给出0和** 2016-12-01 **和** 2016-12-31 **给出1作为输出 –

+0

多少天做一个月? – axiac