我有一个开始/结束时间来进行我正在尝试做的计算,并且在查看结束时间是否在开始时间后的第二天上午 12 点之前遇到问题。另外,我需要计算开始时间过去多少天。
我有什么:开始日期,结束日期
我需要什么: - 结束日期比开始日期晚多少个“午夜”?
有没有人做过这样的事情?
这使用 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);