PHP strotime是错误的(有时)?

PHP strotime是错误的(有时)?,php,Php,在我的PHP代码中,strotime有一个问题,它有时是错误的(仅适用于某些时区),而对其他时区则是正确的 我的头脑绕不过去 我已经在我的页面顶部设置了,但这没有帮助 基本上,它将在$time1=strotime('00:00')中的设置时间上加上或减去offset/3600值取决于if和else if条件 偏移量/3660值是两个时区之间的时差 下面的代码适用于某些位置,但不适用于其他位置!基本上,它会增加额外的1-2小时或起飞/减去额外的1-2小时(并非所有时间) i、 e.阿比让和伦敦之间

在我的PHP代码中,strotime有一个问题,它有时是错误的(仅适用于某些时区),而对其他时区则是正确的

我的头脑绕不过去

我已经在我的页面顶部设置了
,但这没有帮助

基本上,它将在
$time1=strotime('00:00')中的设置时间上加上或减去
offset/3600
取决于if和else if条件

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

下面的代码适用于某些位置,但不适用于其他位置!基本上,它会增加额外的1-2小时或起飞/减去额外的1-2小时(并非所有时间)

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

然而,正如我提到的,它适用于某些时区。 i、 e.对于纽约和伦敦之间的时差-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}";
?>

好吧,因为
strotime()
已经返回了一个时间戳,
date()
希望您可以这样做

$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

您在哪里设置$offset?您是否考虑了时区之间DST的差异?(即,某些时区没有DST;时区内的某些区域不遵守DST,请参阅了解其复杂程度)您是否了解PHP的
DateTime
类,它可以减轻您手动计算差异和间隔的“智能”解决方案的需要?@N.B.是,我看了一眼,这根本不是我所期望的。此外,它似乎非常不必要的复杂。因此,有3行代码比你造成的混乱更复杂?我尝试过你的建议,但仍然是一样的。事实上,现在有了你的建议,它将显示纽约和伦敦的结果如下:14:42,这是错误的。我担心它不起作用。现在,它将以00返回所有值:00@EnergyLynxEnergyLynx好的,我已经翻了一遍,我的答案的最后编辑部分应该给出正确的结果。仍然返回所有值,如:00:00
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