2009-10-05 18:11:08
2009-10-05 18:07:13
这应该生成235,怎么办呢?
Answers:
您可以使用strtotime()来做到这一点:
$diff = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
对于DateTime对象,可以使用类似的方法,例如
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diff = $date2->getTimestamp() - $date->getTimestamp();
date()
用于获取现在的日期时间()时,请务必使用大写的“ H”小时(24小时模式date("Y-m-d H:i:s")
)。
使用DateTime对象,您可以这样做:
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
PHP日期时间参考对于诸如此类的事情很有帮助: PHP日期时间函数
strtotime()可能是最好的方法。
$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
由于unix时代的局限性,在1970年之前和2038年之后的日期计算上可能会遇到问题。我选择放宽精度(=不要看一秒钟),但要避免通过谷歌unix时代转换(getTimestamp)。这取决于你在做什么...
在我的情况下,使用365(12 * 30)和“ 30”作为平均月长可以减少可用输出中的错误。
function DateIntervalToSec($start,$end){ // as datetime object returns difference in seconds
$diff = $end->diff($start);
$diff_sec = $diff->format('%r').( // prepend the sign - if negative, change it to R if you want the +, too
($diff->s)+ // seconds (no errors)
(60*($diff->i))+ // minutes (no errors)
(60*60*($diff->h))+ // hours (no errors)
(24*60*60*($diff->d))+ // days (no errors)
(30*24*60*60*($diff->m))+ // months (???)
(365*24*60*60*($diff->y)) // years (???)
);
return $diff_sec;
}
请注意,如果“平均”数量用于差异,则误差可能为0。PHP文档没有讲到这一点……在很坏的情况下,错误可能是:
我更喜欢假设有人决定将“ m”视为30天,将“ y”视为365,当“ diff”走过非30天月份时,将“ d”的差额收取...
如果有人对此有更多了解并可以提供正式文档,欢迎您!
如果您需要真实的当地时差并希望与 getTimestamp
,则必须考虑在计算的期间内的DST开关。因此,方程中必须包括UTC的局部偏移。
以以下日期为例:
$tz = new \DateTimeZone("Europe/Berlin");
$start = new \DateTime("2018-02-01 12:00:00", $tz);
$end = new \DateTime("2018-04-01 12:00:00", $tz);
$start
在UTC中为“ 2018-02-01 11:00:00”,在UTC中$end
为“ 2018-04-01 10:00:00”。请注意,尽管柏林时区中的一天中的时间相同,但UTC中的时间却有所不同。UTC偏移量为的1小时$start
和的2小时$end
。
请记住,getTimestamp
始终返回UTC!因此,在寻找实际的局部差异时,必须从时间戳中减去偏移量。
// WRONG! returns 5094000, one hour too much due to DST in the local TZ
echo $end->getTimestamp() - $start->getTimestamp();
// CORRECT: returns 5090400
echo ($end->getTimestamp() - $end->getOffset()) - ($start->getTimestamp() - $start->getOffset());