PHP strtotime错了(有时候)?

时间:2013-08-28 13:58:21

标签: php

我的PHP代码中有strtotime这个问题,有时它是错误的(仅限某些时区),对其他人来说是正确的!!

我无法理解它。

我已将<?php date_default_timezone_set('GMT'); ?>设置在我的页面顶部,但这没有帮助!

它的作用基本上是它会在offset/3600中将$time1 = strtotime('00:00');值加到或减去设定时间,具体取决于if和else if条件。

偏移/ 3660值是两个时区之间的时差!

代码bellow适用于某些位置,而不适用于其他位置!基本上它会额外增加1-2个小时或多次减少/减去1-2个小时(不是所有时间)。

即。阿比让和伦敦之间的时差是-1。 应显示的时间(值)为00:00 - 00:00 - 01:00 = 23:00。但是显示的值是00:00。

然而正如我所提到的,它适用于某些时区。 即纽约和伦敦之间的时差为-5,代码有效,显示19:00为00:00 - 05:00 = 19:00

有人可以对此有所了解吗?

这是有问题的代码:

<?php
$time1 = strtotime('00:00');

if (0 > $offset)
{
   // For negative offset (hours behind)
  $hour_dif = date('H:i', strtotime($time1 -$offset/3600));
  $time1 = "{$hour_dif}";
}
elseif (0 < $offset)
{
   // For positive offset (hours ahead)
     $hour_dif = date('H:i', strtotime($time1 +$offset/3600));
     $time1 = "{$hour_dif}";

}
else
{
   // For offsets in the same timezone.
   $time1 = "in the same timezone";
}

echo "{$time1}";
?>

1 个答案:

答案 0 :(得分:3)

好吧,因为strtotime()已经返回了一个时间戳,date()期望你可以做一个

$hour_dif = date('H:i', ($time1 - ($offset*3600)));

$hour_dif = date('H:i', ($time1 + ($offset*3600)));

分别从时间戳中移除或添加正确的秒数。

我还假设$offset是以小时为单位的偏移,因此您必须乘以3600才能得到秒数,而不是除以。


好吧,在测试你的代码并仔细思考之后,很明显。

使用像-1这样的负偏移量,您将计算$time1 - (-1) * 3600,我们都知道双重否定是正面的...

事实上,您的代码可以压缩为:

$time1 = strtotime('00:00');

if ($offset == 0)
     $time1 = "in the same timezone";
else
{
   // For positive offset (hours ahead)
     $hour_dif = date('H:i', ($time1 + ($offset*3600)));
     $time1 = "{$hour_dif}";
}

echo "{$time1}\n";

并且应该按预期工作:

cobra@box ~ $ for i in {-24..24}; do php test.php $i; done;
00:00
01:00
02:00
03:00
04:00
05:00
06:00
07:00
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
21:00
22:00
23:00
in the same timezone
01:00
02:00
03:00
04:00
05:00
06:00
07:00
08:00
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
19:00
20:00
21:00
22:00
23:00
00:00