2009-10-05 18:11:08
2009-10-05 18:07:13
这应该生成235,怎么做?
答案 0 :(得分:140)
使用DateTime对象,您可以这样做:
$date = new DateTime( '2009-10-05 18:07:13' );
$date2 = new DateTime( '2009-10-05 18:11:08' );
$diffInSeconds = $date2->getTimestamp() - $date->getTimestamp();
答案 1 :(得分:73)
您可以使用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();
答案 2 :(得分:8)
PHP日期时间参考对以下内容有帮助:PHP Date Time Functions
strtotime()可能是最好的方法。
$seconds = strtotime('2009-10-05 18:11:08') - strtotime('2009-10-05 18:07:13')
答案 3 :(得分:4)
由于unix epoch限制,你可能会遇到1970年之前和2038年之后的日期问题。我选择松散精度(=不看单秒)但避免通过unix epoch转换(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,当“差异”走过非30天的月份时,将“d”视为差异......
如果有人了解更多相关信息并提供官方文档,欢迎提供!
答案 4 :(得分:2)
strtotime("2009-10-05 18:11:08") - strtotime("2009-10-05 18:07:13")
答案 5 :(得分:2)
如果您需要真实的本地时差并想使用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”,而$end
在UTC中是“ 2018-04-01 10:00:00”。请注意,尽管柏林时区中的一天中的时间相同,但UTC中的时间却有所不同。 UTC偏移量在$start
中是一小时,在$end
中是2小时。
请记住,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());
答案 6 :(得分:2)
对于那些担心使用时间戳的限制(即使用 1970 年之前和 2038 年之后的日期)的人,您可以像这样简单地计算秒差:
$start = new DateTime('2009-10-05 18:11:08');
$end = new DateTime('2009-10-05 18:07:13');
$diff = $end->diff($start);
$daysInSecs = $diff->format('%r%a') * 24 * 60 * 60;
$hoursInSecs = $diff->h * 60 * 60;
$minsInSecs = $diff->i * 60;
$seconds = $daysInSecs + $hoursInSecs + $minsInSecs + $diff->s;
echo $seconds; // output: 235
为有兴趣阅读更多内容的人写了一篇blog post。
答案 7 :(得分:-1)
一个简单而精确的解决方案(以Nilz11的评论为例):
$hiDate = new DateTime("2310-05-22 08:33:26");
$loDate = new DateTime("1910-11-03 13:00:01");
$diff = $hiDate->diff($loDate);
$secs = ((($diff->format("%a") * 24) + $diff->format("%H")) * 60 +
$diff->format("%i")) * 60 + $diff->format("%s");