在事件之间产生错误信息的时间

时间:2017-02-07 15:31:26

标签: php mysql math time

问题

在我们的日历中,用户可以制作将加载到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],那么它会给我一个不合时宜的值。

这是一个视觉表现。正如你所看到的那样,一个值是正确的而另一个值是......而不是:

enter image description here

有没有更好的方法来模拟我正在进行的两个事件之间的时间,或者我想要修复此问题的更好的数学?我有很长的路要走,但是要按照我写的方式来解决每一次都要困难得多。希望这也可以帮助其他人。

数据库结构

enter image description here

2 个答案:

答案 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;