【问题标题】:PHP strtotime is wrong (some times)?PHP strtotime 是错误的(有时)?
【发布时间】:2013-08-28 13:58:20
【问题描述】:

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

我无法理解它。

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

基本上它的作用是根据 if 和 else if 条件将 offset/3600 值添加或减去 $time1 = strtotime('00:00'); 中的设置时间。

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

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

即阿比让和伦敦的时差是-1。 应显示的时间(值)为 23: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}";
?>

【问题讨论】:

  • 你在哪里设置 $offset?
  • 您是否考虑到时区之间的夏令时差异? (即,某些时区没有 DST;时区内的某些地区不遵守 DST,请参阅 en.wikipedia.org/wiki/Daylight_saving_time_by_country 了解它的复杂程度)
  • 您知道 PHP 的 DateTime 类可以减轻您为手动计算差异和间隔提出“智能”解决方案的需要吗?
  • @N.B.是的,我看了看,这根本不是我所期望的。而且,它似乎非常复杂。
  • 那么 3 行代码比你创造的这个烂摊子还复杂吗?

标签: php


【解决方案1】:

好吧,因为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

【讨论】:

  • 我确实尝试了你的建议,但还是一样。
  • 事实上现在有了你的建议,它会像这样显示纽约和伦敦的结果:14:42 这是错误的。
  • 恐怕它不起作用。现在它将所有值返回为 00:00
  • @EnergyLynxEnergyLynx 好的,我已经研究过了,我答案的最后编辑部分应该给出正确的结果。
  • 仍然返回所有值,如下所示:00:00
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2015-10-04
  • 2011-05-29
相关资源
最近更新 更多