这不应该很难,但我仍然不明白发生了什么。
<?php
echo date( 'H:i', strtotime( '09:00' ) - strtotime( '08:00' ) );
// returns 02:00 instead of 01:00
echo date( 'H:i', strtotime( '18:45' ) - strtotime( '17:15' ) );
// returns 02:30 instead of 01:30
echo date( 'H:i', strtotime( '17:00' ) - strtotime( '09:00' ) );
// returns 09:00 instead of 08:00
所以也许我需要添加日期?
<?php
echo date( 'H:i', strtotime( '22-09-2016 17:00:00' ) - strtotime( '22-09-2016 09:00:00' ) );
// still 09:00 instead of 08:00
我正在Xampp中使用Laravel进行测试。
在Laravel /config/app.php 'timezone' => 'Europe/Amsterdam',
在Xampp中date_default_timezone_set('Europe/Amsterdam');
仍然没有区别。
此计算在刀片模板中完成,我无法访问DateTime类。
我找到了一种使用DateTime类的方法。另一种解决方案是将时区更改为UTC
,但其他所有时间戳都是错误的。
答案 0 :(得分:5)
使用DateTime对象找到差异,如
$time1 = new DateTime('18:45');
$time2 = new DateTime('17:15');
$interval = $time1->diff($time2);
echo $interval->format('%H:%I');
答案 1 :(得分:3)
作为Rakesh发布的方法的纯粹替代品,因为您只查看时间值而不是日期值,因此您不需要[轻微]开销通过将所有内容转换为unix时间戳来生成strtotime
。你也不需要担心时区,因为这是一个纯粹的数学运算。
function minutes_from_time($time){
$parts = explode(":",$time);
$minutes = ($parts[0] * 60) + $parts[1];
return $minutes;
}
$timeLapsed = minutes_from_time("09:00") - minutes_from_time("08:00");
/***
Format into H:i
***/
$hours = floor($timeLapsed/60);
$minutes = $timeLapsed - ($hours * 60);
$minutes = sprintf("%02d", $minutes); //force 2 digit minutes.
$hours = sprintf("%02d", $hours); //force 2 digit hours.
$result = $hours.":".$minutes;
您可能需要处理一些跨越午夜的特殊情况,但......
如果将来您确实要包含日期和/或时区数据,那么请务必使用我自己和其他人推荐的DateTime class。
答案 2 :(得分:2)
时区问题。
echo date('Y-m-d H:i:s', 0); //return "1970-01-01 01:00:00";
echo date('Y-m-d H:i:s', 3601); //return "1970-01-01 02:00:01";
使用DateTime::diff
进行正确的工作