2016-12-29 65 views
0

我很奇怪,为什么我一直在用PHP所有的时间去完全无效的计算之间的日期。差异服务器

我有这样的代码:

echo floor((strtotime("2017-03-27") - strtotime("2017-03-24"))/86400); 

其在服务器返回的一个:3(比如3天)

,并在另一台服务器的回报:2! (2.9583333333333天?)为什么会有差异?

+0

为什么无论什么是圣洁的世界各国都在使用'楼()在'日期计算? – junkfoodjunkie

+0

@junkfoodjunkie是禁止的吗?很高兴知道,也许这是导致我的问题? – corey

+2

致命的假设,每天有86400个假设 –

回答

2

或者,只是使用更好的方法:

编辑我更新使用相同的日期作为OP的代码。它会返回,因为它应该这样做,我相当确信它会在您将其用于测试的任何服务器上执行此操作。

<?php 

$date1 = date_create('2017-03-27'); 
$date2 = date_create('2017-03-24'); 

$interval = date_diff($date1,$date2); 

echo $interval->format('%a'); 

?> 

编号:http://php.net/manual/en/function.date-diff.php

0

你的服务器也许坐在两个不同的时区。将日期转换为小时,您将得到一小时的差异。

3 days  * 24 hours/1 day = 72 hours 
2.958333 days * 24 hours/1 day = 71 hours 
+0

我想这也可能是自3月份以来的日期变化。 – Sammitch

+0

@Sammitch DST于3月12日星期日在美国大多数州**假设** Corey在美国,所以如果两台服务器在同一个时区,与DST无关。超过一个小时,一台服务器可能比另一台服务器长。 – user7351608

+0

DST的变化在3月26日几乎是世界其他地方。 – Sammitch

0

由于某些人的难以接受,这是由于特定的TZ-DST的变化,有一些证据:

function poc($tz_str) { 
     $tz = new DateTimeZone($tz_str); 
     $start = (new DateTime('2017-03-24', $tz))->format('U'); 
     $end = (new DateTime('2017-03-27', $tz))->format('U'); 

     return [$tz_str, $end - $start, ($end - $start)/86400]; 
} 

var_dump(
     poc('UTC'), 
     poc('Europe/London'), 
     poc('America/New_York') 
); 

输出:

array(3) { 
    [0]=> string(3) "UTC" 
    [1]=> int(259200) 
    [2]=> int(3) 
} 
array(3) { 
    [0]=> string(13) "Europe/London" 
    [1]=> int(255600) 
    [2]=> float(2.9583333333333) 
} 
array(3) { 
    [0]=> string(16) "America/New_York" 
    [1]=> int(259200) 
    [2]=> int(3) 
} 
  • UTC没有DST,不受影响。
  • 大多数东半球的有3月26日他们的DST更改,影响
  • 3月12日,西半球大部分地区的DST变化未受影响。

也就是说,不要在Unix时间戳上进行手动日期数学计算。