从php计算的日期不一致


inconsistent day calculations from php

此脚本返回不一致的天数计数。在localhost返回14天,在客户端服务器返回15天。

    $_POST['pickup_time'] = '13:30';
    $_POST['dropoff_time'] = '12:00';
    $_POST['pickup_date'] = '2013-10-16';
    $_POST['dropoff_date'] = '2013-10-30';

    $fmt_pickup_date = strtotime($_POST['pickup_date']);
    $fmt_dropoff_date = strtotime($_POST['dropoff_date']);
    $days = ceil(abs($fmt_dropoff_date - $fmt_pickup_date) / 86400);
    if ($vehicles[$v]['vehicle_cal_date']==0)
    {
        $fmt_pickup_time = str_replace(":", "", $_POST['pickup_time']);
        $fmt_dropoff_time = str_replace(":", "", $_POST['dropoff_time']);
        if (($fmt_dropoff_time-$fmt_pickup_time)>=1)
        {
            $days++;
        }
    }
    else { $days++; }

对于某些日期返回正确的天数,对于某些日期返回错误的天数(+1天)。

    [pickup_time] => 11:00
    [dropoff_time] => 10:00
    [pickup_date] => 2013-10-28
    [dropoff_date] => 2013-11-01

这些日期在两个服务器上返回4天,这是正确的。

任何想法?怎么了?

编辑:

似乎:

    date_default_timezone_set('UTC');

修复了这个问题,现在脚本返回两个日期的正确天数。要多久,我不知道。我希望这将修复它为所有的日期:)

这个问题真的很简单,这是我一直在重复很长一段时间…当然,如果你将时区设置为UTC,它就会工作!

为什么?

很简单,因为DST。当夏令时开始或结束时,天不是24小时(而是23或25小时)。所以,当你用86400秒做数学运算时,也就是24小时,这是行不通的!

将时区设置为UTC,它不使用夏令时,是一种解决方法。然而,在我看来,最干净的解决方案是使用DateTime类并让它来做数学运算:http://php.net/datetime这些函数都有对时区的内置支持,所以它们可以正确处理夏令时。

这可能与本地主机和客户端服务器上php设置的差异有关。我过去所做的是比较每个phpinfo(),看看问题可能在哪里。也许是php的日期配置?

不要用自己的代码去做php已经做过的事情。

试试这个:

$datetime1 = new DateTime('2013-10-28');
$datetime2 = new DateTime('2013-11-01');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

该输出为+4天。

希望这对你有帮助

以下是关于datetime函数的官方文档,以及你可以使用它们做的所有事情:http://php.net/manual/en/datetime.diff.php