PHP时间数学的奇怪行为:为什么strtotime()返回负数?

时间:2009-06-30 02:32:32

标签: php

我正在尝试做一些非常基本的时间数学 - 基本上,考虑到时间和距离的输入,计算速度。我选择使用strtotime()将时间输入转换为秒 - 但我得到了一些奇怪的结果。

例如,给定此示例程序:

<?php
$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 . "\n";
echo $t2 . "\n";
echo $t3 . "\n";
echo $t4 . "\n";
?>

为什么我会得到这些结果?

$ php test.php 
-56700
-64800
-61200
-36000

更新

由于没有人明确说过,让我解释一下上述函数中的错误。我曾假设将零时间传递给strtotime()将导致它生成从午夜,12月31日,UTC,UTC生成的时间戳 - 这听起来很奇怪,但可以用于我的目的。

我没有指望的是strtotime()在转换字符串时会考虑时区,而我的服务器显然比UTC晚了5个小时。最重要的是,由于时区转换,PHP然后将时间解释为相对于时代前一天,这意味着它将我的时间解释为相对于12月 30日发生,1969而不是第31,导致负数......

看来Eugene是正确的 - 如果我只想计算经过的时间,我就不能使用内置的时间函数。

5 个答案:

答案 0 :(得分:5)

如果你想做类似的事情,我想你只想对时间字符串本身做一些数学运算并将它们转换为几秒钟,如下所示:

<?php
function hmstotime($hms)
{
    list($hours, $minutes, $seconds) = explode(":",$hms);
    return $hours * 60 * 60 + $minutes * 60 + $seconds;
}
?>

答案 1 :(得分:2)

显然,只有几分钟,PHP才会分配日期为1969年12月31日。当我运行时:

echo date('F j, Y H:i:s', $t1) . "\n";
echo date('F j, Y H:i:s', $t2) . "\n";
echo date('F j, Y H:i:s', $t3) . "\n";
echo date('F j, Y H:i:s', $t4) . "\n";

我明白了:

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时间戳是指特定的月/日/年,因此尽管名称为{{ 1}}并不适用于没有日期的裸露时间。

答案 2 :(得分:1)

因为strtotime()输出相对于第二个参数的秒数(在您的情况下,Unix时期(1969年12月31日19:00:00))。

负数是预期的,因为“3:15:00”是Unix时代之前的56700秒。

答案 3 :(得分:0)

不使用第二个参数尝试。这应该是返回时间相对于的时间戳。给它0意味着你要求相对于Unix时代的时间戳。

回应你的评论:

它没有记录功能,但我一直使用strtotime("HH:MM"),它返回相对于当前时间的时间戳。我想如果你想确定,你可以这样做:

strtotime("3:15:00",time());

答案 4 :(得分:0)

没有第二个参数的

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);

或者那种性质......