问题
在我们的日历中,用户可以制作将加载到MySQL数据库中的事件。存储开始时间并存储结束时间。在数据库中,它们像这样存储
start_time_first, start_time_second, end_time
example:
`9`, `30`, `11:00` (9:30 - 11:00)
`13`, `10`, `14:25` (1:10 - 2:25)
然后我在加载时将变量分开,给我4个变量,这些变量都是预期的,使用以下内容:
$real_time_start = $time_start[0] . $time_start[1]; // gives something like 930
$real_time_end = $time_end[0] . $time_end[1]; // gives something like 1100
$difference = $real_time_end - $real_time_start; // find the difference
// pad the difference for 30 minutes
// and then format it for display
$difference = str_pad($difference, 3, '0', STR_PAD_LEFT);
$difference = $difference[0].":".substr($difference, -2, 2);
我遇到的一个明显问题是,如果time_end
事件为1100
且开头为930
,那么当我减去它时,我得到的值是70而不是30。 time_end[1]
低于time_start[1]
,那么它会给我一个不合时宜的值。
这是一个视觉表现。正如你所看到的那样,一个值是正确的而另一个值是......而不是:
有没有更好的方法来模拟我正在进行的两个事件之间的时间,或者我想要修复此问题的更好的数学?我有很长的路要走,但是要按照我写的方式来解决每一次都要困难得多。希望这也可以帮助其他人。
数据库结构
答案 0 :(得分:1)
您不能使用十进制系统减去日期时间,因为分钟从60流到下一小时而不是100. PHP为此提供DateTime / DateInterval类:
$start=new DateTime('9:30');
$end=new DateTime('11:00');
$diff=$start->diff($end);
var_dump($diff->format('%H:%i'));
(这只是为了证明;理论上这可能会对DST造成问题,所以如果可以的话,你也应该包括日期以获得精确的解决方案。)
答案 1 :(得分:0)
不知道为什么我之前没有考虑到这一点,但感谢我添加了一些不错的评论者:00到时间结束然后strtotime
他们所以我在事件之间的秒数差异。从这里可以很容易地将秒转换为小时,分钟等可读输出。谢谢大家的帮助!
$real_time_start = $time_start[0] .":". $time_start[1] .":00";
$real_time_end = $time_end[0] .":". $time_end[1] .":00";
$real_time_start = strtotime($day . "-" . $month . "-" . $year . " " . $real_time_start);
$real_time_end = strtotime($day . "-" . $month . "-" . $year . " " . $real_time_end);
$difference = $real_time_end - $real_time_start;