【问题标题】:Calculating how many 'Midnights' is one date past another in PHP?在 PHP 中计算一个日期过去有多少个“午夜”?
【发布时间】:2011-07-10 01:37:57
【问题描述】:

我有一个计算的开始/结束时间,但我在查看结束时间是否在开始时间后的第二天上午 12 点之前遇到问题。另外,我需要计算开始时间之后的天数。

我有什么:开始日期,结束日期

我需要什么: - 结束日期比开始日期晚多少个“午夜”?

有人做过这样的事吗?

【问题讨论】:

    标签: php-5.2 php


    【解决方案1】:

    这使用 PHP 5.3,如果您有较早的版本,您可能需要使用 unix 时间戳来找出差异。假设开始时间和结束时间相同,则午夜数应该是天数差。因此,将两者都设置为当天的午夜 setTime(0,0),应该会使计算正确。

    使用 DateTime 对象。

    $start = new DateTime('2011-03-07 12:23:45');
    $end = new DateTime('2011-03-08 1:23:45');
    
    $start->setTime(0,0);
    $end->setTime(0,0);
    
    $midnights = $start->diff($end)->days;
    

    如果不使用 setTime() 调用,这将导致 0,因为开始和结束之间的时间少于 24 小时。使用setTime(),结果为 1,因为现在差值正好是 24 小时。

    diff() 函数是在 5.3 中与 DateInterval 类一起引入的。在 5.2 中,您仍然可以使用 DateTime 类,但必须使用 Unix 时间戳计算总天数。

    $midnights = ($end->format('U') - $start->format('U')) / 86400
    

    您可以将其包装在 abs() 函数中,以开始/结束的顺序无关紧要。

    注意:这些功能可能需要针对涉及 DST 的情况进行测试。

    php date documentation 中的评论在除以 86400(一天中的秒数)后使用四舍五入,以应对 DST 可能涉及的任何问题。

    使用 DateTimes 的另一种方法是在 UTC 中创建它们。

    $utcTimezone = new DateTimeZone('UTC');
    $start = new DateTime('2011-03-07 12:23:45', $utcTimezone);
    $end = new DateTime('2011-03-08 1:23:45', $utcTimezone);
    

    【讨论】:

    • 我们使用的是 5.2.10,但我会研究类似的东西。谢谢!
    • 唯一不能使用的就是最后一行。我正在用 5.2 替代方案更新答案。
    • 非常感谢您的帮助。实施后我会更新答案
    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 2012-08-13
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多