3

我有一个开始/结束时间来进行我正在尝试做的计算,并且在查看结束时间是否在开始时间后的第二天上午 12 点之前遇到问题。另外,我需要计算开始时间过去多少天。

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

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

有没有人做过这样的事情?

4

1 回答 1

4

这使用 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 日期文档中的注释在除以 86400(一天中的秒数)后使用 round,以解决 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);
于 2011-03-07T02:31:25.877 回答