概述
我正在尝试做一些非常基本的时间数学运算-基本上,只要输入时间和距离,就可以计算速度。我选择使用strtotime()将时间输入转换为秒-但我得到了一些奇怪的结果。
例如,给出以下示例程序:
$t1 = strtotime("3:15:00",0);
$t2 = strtotime("1:00:00",0);
$t3 = strtotime("2:00:00",0);
$t4 = strtotime("9:00:00",0);
echo $t1 ."
";
echo $t2 ."
";
echo $t3 ."
";
echo $t4 ."
";
?>
为什么会得到这些结果?
$ php test.php
-56700
-64800
-61200
-36000
更新:
由于没有人明确说过这一点,所以让我解释一下上述功能中的错误。我以为将零时间传递给strtotime()会导致它生成从UTC午夜12/31/1969派生的时间戳-听起来很奇怪,但可以满足我的目的。
我没有指望的是,转换字符串时strtotime()考虑了时区,而且我的服务器显然比UTC落后5个小时。最重要的是,由于时区的变化,PHP然后将时间解释为相对于纪元前一天的时间,这意味着它将时间解释为相对于1969年12月30日而不是31日,发生了负数。 ..
看来Eugene是正确的-如果我只想计算经过的时间,则无法使用内置的时间函数。
"如果我只想计算经过的时间,则不能使用内置的时间函数。" -不,您可以,仅省去strtotime()的第二个参数。您将获得今天与您指定的时间的时间戳,时区并不重要。您仅通过提供0作为第二个参数来激发边缘情况。
这是没有意义的。再说一次-我不希望有绝对的时间,我需要将用户输入的字符串转换为秒。解决方案唯一可行的方法是执行类似strtotime(" user string",time())-strtotime(" midnight",time());
所以?您正在使用strtotime()将字符串转换为秒,仅将1970年以来的所有秒都添加进去。但是,如果您仅在这些时间戳之间进行相对计算,则没关系。 0、900、1345或1246399668、1246400568、1246401013-两个相对关系相同。
当然,除非所有时间都隐式相对于0,否则我将您的要求读取为"一天中的输入时间"(绝对时间),而不是"经过的时间"。
...我有距离和时间,我想计算速度。至于距离/时间,您知道吗?我一直说那不是绝对的时间。将距离除以自1970年以来的秒数将不会产生有用的数字!
如果您想做类似的事情,我想您只想对时间字符串本身做一些数学运算,然后将它们转换为若干秒,就像这样:
function hmstotime($hms)
{
list($hours, $minutes, $seconds) = explode(":",$hms);
return $hours * 60 * 60 + $minutes * 60 + $seconds;
}
?>
查看其他答案,这可能是唯一的方法。
考虑您执行此操作可能是您正在寻找的东西(计算速度和类似的东西)。 如果可能的话,strtotime将需要做一些更复杂的工作来做您想做的事情-我还没有尝试过。
显然,只有很少的时间,PHP才将日期分配为1969年12月31日。
echo date('F j, Y H:i:s', $t1) ."
";
echo date('F j, Y H:i:s', $t2) ."
";
echo date('F j, Y H:i:s', $t3) ."
";
echo date('F j, Y H:i:s', $t4) ."
";
我懂了:
December 31, 1969 03:15:00
December 31, 1969 01:00:00
December 31, 1969 02:00:00
December 31, 1969 09:00:00
请记住,strtotime返回的是UNIX时间戳,它定义为自1970年1月1日以来的秒数。根据定义,UNIX时间戳是指特定的月/日/年,因此尽管名称strtotime并不是真正的意思。没有日期的裸露时间。
那么,如何将裸机时间转换为经过的秒数?
因为strtotime()输出相对于第二个参数的秒数(在您的情况下为Unix纪元(1969年12月31日19:00:00))。
预期为负数,因为" 3:15:00"是Unix时代之前的56700秒。
在纪元开始之前如何出现积极的时间? 这是时区的事吗?
没有第二个参数的strtotime()从提供的字符串中获取时间,并从当前日期开始填充空格:
echo date('Y-m-d H:i:s', strtotime("3:15:00"));
-> 2009-06-30 03:15:00
使用第二个参数,它计算相对于第二个参数的日期:
echo date('Y-m-d H:i:s', strtotime("3:15:00", 0));
-> 1970-01-01 03:15:00
要计算以秒为单位的两个时间戳之间的时差,您可以执行以下操作:
echo strtotime("3:15:00") - strtotime("3:00:00");
-> 900
编辑:当然要考虑哪个是更大的数字:
$t1 = strtotime("3:15:00");
$t2 = strtotime("3:30:00");
$diff = max($t1, $t2) - min($t1, $t2);
$diff = abs($t1 - $t2);
或那种性质的东西
尝试不使用第二个参数的情况。这应该是相对于返回时间的时间戳。赋予0意味着您要相对于Unix时代的时间戳。
针对您的评论:
它没有记录功能,但是我一直使用strtotime("HH:MM"),并且它返回相对于当前时间的时间戳。我想如果您想确定的话,可以这样做:
strtotime("3:15:00",time());
那会不会给我从1969年至今的秒数,再加上提供的时间? 我想要的只是将提供的时间转换成秒。
我已经更新了我的答案,以解决您的评论。
这仍然给了我相对于纪元的时间,而不仅仅是将字符串转换为秒。
记住-最初的目的是获取用户输入的距离和经过的时间并计算速度。 时间不是一天中的时间。
最后
以上就是清秀花瓣为你收集整理的php程序耗时是负数,PHP时间数学的奇怪行为:为什么strtotime()返回负数?的全部内容,希望文章能够帮你解决php程序耗时是负数,PHP时间数学的奇怪行为:为什么strtotime()返回负数?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复