服务器之间的日期差异

时间:2016-12-29 20:22:38

标签: php date datetime floor

我想知道为什么我一直在用PHP完全无效的计算。

我有这样的代码:

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

在其中一个服务器上返回:3(如3天)

并在另一台服务器上返回:2! (2.9583333333333天?)为什么会出现差异?

3 个答案:

答案 0 :(得分:2)

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

编辑我更新了代码以使用与OP相同的日期。它应该返回 3 ,并且我相信它会在你测试它的任何服务器上做到这一点。

<?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

答案 1 :(得分:0)

您的服务器可能位于两个不同的时区。将天数转换为小时,您将获得一小时的差异。

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

答案 2 :(得分: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时间戳上进行手动日期数学运算。