【发布时间】:2011-07-10 01:37:57
【问题描述】:
我有一个计算的开始/结束时间,但我在查看结束时间是否在开始时间后的第二天上午 12 点之前遇到问题。另外,我需要计算开始时间之后的天数。
我有什么:开始日期,结束日期
我需要什么: - 结束日期比开始日期晚多少个“午夜”?
有人做过这样的事吗?
【问题讨论】:
我有一个计算的开始/结束时间,但我在查看结束时间是否在开始时间后的第二天上午 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 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);
【讨论】: