【问题标题】:strtotime is different with timezonestrtotime 与时区不同
【发布时间】:2013-11-28 09:26:51
【问题描述】:

似乎我不太了解函数strtotime。我的情况是我想将当前时间(现在)与特定时区的特定时间进行比较

例如,具体时间是“美国/纽约”时区的“本周一 14:00:00”:

 $specificTime  = strtotime("monday this week 14:00:00 America/New_York");

我当前的代码是:

 $now  = strtotime("now America/New_York");
 if ($now > $specificTime) {
     //do something
 }

但我发现上面的$now 比当前时间提前了 6 小时。我猜数字 6 来自 America/New_York 的偏移量 -05:00,加上 1 小时的夏令时。

它应该从$now 中删除时区,它会正常工作:

 $now  = strtotime("now");
 if ($now > $specificTime) {
     //do something
 }

有人可以解释为什么strtotime("now America/New_York")strtotime("now) 提前6 小时,为什么它们不相等?真的很迷茫。

P.S:我在 GMT+07:00。

【问题讨论】:

  • 如果您知道它们是什么,则可以随时通过添加 X 秒来转换到不同的时区。
  • 当您的机器处于完全不同的时区时,为什么您会期望 nownow America/New_York 等效?此外,strtotime 也不是魔法。我永远不想依靠它来获得正确的“本周星期一 14:00:00 America/New_York”。您是否尝试过使用DateTime,明确设置时区并进行一些日期数学运算?
  • 好吧,因为strtotime 返回一个时间戳,而时间戳不依赖于时区。如此简单的思考,这里的“现在”也等同于世界上任何地方的“现在”。我的意思是为什么差值提前 6 小时?
  • 因为如果你站在纽约,now 表示当前时间。同时,如果您在欧洲睡觉,now 是不同的时间(但同一时刻)。

标签: php


【解决方案1】:

简单调试:

<?php

$now  = strtotime("now America/New_York");
echo date('r', $now);
// Thu, 28 Nov 2013 16:39:51 +0100

... 表明这样的命令正在这样做:

  1. 以我的默认时区 (10:39:51 +0100) 计算本地时间
  2. 返回对应于纽约时间 10:39:51 的时间戳 (-0500)

使用字符串进行日期操作非常复杂。试想一下,您会尝试使用字符串函数进行数学运算:strtofloat('one plus square root of half hundred') — 会有很大的错误空间。所以我的建议是保持简单,只在有一些好处时使用简单的表达式,例如strtotime('+1 day')

如果您需要使用不同的时区,我建议您使用正确的DateTime 对象。如果您选择使用 Unix 时间戳,请忘记时区:Unix 时间戳根本没有时区信息。

【讨论】:

  • "+1 month" 是 IMO 的一个坏例子。我们在这里回答“+1 个月没有按我认为应该的那样工作”问题的频率... ;-) 但我同意整体观点。
  • 我已经更改了示例,以防万一。我希望关于+1 day 的问题不会没完没了。
  • 但我期待“21:30:59”! ;-) 问题在于这里的“期望”概念......我只是在挑剔。
【解决方案2】:

您可以为此使用DateTime。我认为在strtotime 中设置时区无效。

$specificTime = new DateTime("monday this week 14:00:00", new DateTimeZone("America/New_York")));

$now = new DateTime("now", new DateTimeZone("America/New_York"));

然后您可以将 unix 时间戳与此进行比较:

if ($now->getTimestamp() > $specificTime->getTimestamp()) {
    // do something ...
}

【讨论】:

    【解决方案3】:

    每个时区之间存在时间偏移。

    strtotime()函数会根据时区返回Unix时间戳。

    除非在该参数中指定了时区,否则它将使用默认时区。

    默认时区,返回值为date_default_timezone_get()

    看下面的代码:

    <?php
    // UTC
    echo date_default_timezone_get(), "\n";
    
    // 2013-11-28 14:41:37
    echo date('Y-m-d H:i:s', strtotime("now America/New_York")), "\n";
    
    // 2013-11-28 09:41:37
    echo date('Y-m-d H:i:s', strtotime("now")), "\n";
    

    【讨论】:

      猜你喜欢
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多