php程序耗时是负数,PHP时间数学的奇怪行为:为什么strtotime()返回负数?

我正在尝试做一些非常基本的时间数学运算-基本上,只要输入时间和距离,就可以计算速度。我选择使用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年至今的秒数,再加上提供的时间? 我想要的只是将提供的时间转换成秒。

我已经更新了我的答案,以解决您的评论。

这仍然给了我相对于纪元的时间,而不仅仅是将字符串转换为秒。

记住-最初的目的是获取用户输入的距离和经过的时间并计算速度。 时间不是一天中的时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值