【问题标题】:inconsistent day calculations from php来自php的不一致的天数计算
【发布时间】:2013-06-11 16:11:58
【问题描述】:

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

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

【问题讨论】:

  • 您使用的服务器是在哪个时区配置的?也许他们有不同的日期。
  • 你真的不应该在字符串上做“数学”。 13:30 - 12:00 可能有效,但即使使用 : => 您正在做的空字符串替换,它仍然非常麻烦。为什么不使用提供的 php DateTime 类来做所有这些“数学”?
  • 'vehicle_cal_date' 变量有什么不同吗?因为这可能会导致天++?
  • 请仔细阅读我的建议,在编写自己的代码之前尝试始终使用 php 内置函数

标签: php date datetime timezone days


【解决方案1】:

这个问题真的很简单,这是我一直在重复的问题...当然,如果您将时区设置为 UTC,它就可以工作!

为什么?

很简单,因为 DST。当 DST 开始或结束时,日子不是长 24 小时(而是 23 或 25)。所以,当你用 86400 秒(即 24 小时)计算时,这是行不通的!

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

【讨论】:

  • @notneededanymore 这个答案从字面上很好地回答了你的问题。请授予它绿色的勾号。 sandino,如果你还没有,应该得到你的支持,因为他为你的案例提供了最短的解决方案。
【解决方案2】:

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

【讨论】:

  • 这个答案不一定是错误的,但与 Qualcuno 的死板答案相比,它更像是一个普遍的猜测。这个答案几乎可以是对这个问题的评论。
  • 同意@mickmackusa。当我发布这个作为答案时,我还是个菜鸟。
【解决方案3】:

不要使用你自己的代码来做 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多