来自php的不一致的一天计算

时间:2013-06-11 16:11:58

标签: php date datetime timezone days

此脚本返回不一致的天数。 在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');

修复了问题,现在脚本会返回两个日期的正确天数。多久 - 不知道。我希望这可以解决所有日期:)

3 个答案:

答案 0 :(得分:2)

问题非常简单,这是我长期以来一直在重复的问题......当然,如果你将时区设置为UTC,它就有用了!

为什么?

简单地说,因为DST。当DST开始或结束时,天数不会长24小时(而是23或25天)。因此,当您使用86400秒(24小时)进行数学计算时,这不起作用!

将时区设置为UTC(不使用DST)是一种解决方法。但是,在我看来,最干净的解决方案是使用DateTime类并让它进行数学运算:http://php.net/datetime 这些函数内置了对时区的支持,因此它们可以正确处理DST。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

不要使用自己的代码来制作php已经做过的事情。

试试这个:

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

输出为+4天。

希望这有助于你

以下是有关日期时间功能的官方文档,您可以使用它们完成所有操作: http://php.net/manual/en/datetime.diff.php