【问题标题】:Why does strtotime give different result in different timezone?为什么 strtotime 在不同的时区给出不同的结果?
【发布时间】:2011-09-03 18:55:11
【问题描述】:

我不确定为什么 PHP 中的 strtotime() 会在不同的时区返回不同的结果,即使给出了相同的日期作为参数,有人知道答案吗?我也想知道,我可以用另一个在不同时区给出相同结果的函数做类似的任务(将datetime 转换为int 以轻松进行计算)吗?

编辑:

一个例子: 如果我使用strtotime('2011-09-19 00:00:00'),它不应该只在几秒钟内返回'January 1 1970 00:00:00''2011-09-19 00:00:00' 之间的差异吗?为什么时区在这里是一个问题?我能得到一些没有时区问题的东西吗?

【问题讨论】:

  • 因为不同时区的时间不同?
  • 你能提供一些你想要做的代码吗?
  • @jeffamaphone 我给出了与参数相同的日期时间,它不应该将其转换为 int,如何处理时区,这是我想知道的吗?
  • 是的,我不是专家,但我怀疑它希望你给它一些 UTC 时间或其他东西,并且正在为你转换。我确信有办法防止这种情况发生。
  • @Jared Farris 谢谢,但我的代码没有问题。当我将我的应用程序移动到具有不同时区的服务器时,我遇到了问题。

标签: php strtotime unix-timestamp date-conversion


【解决方案1】:

简而言之:考虑时区是因为在 GMT 中考虑了 Unix Epoch 值。

从广义上讲,2011-09-19 00:00:00 几乎在 6 小时后到达孟加拉国,它是格林威治标准时间区的2011-09-19 00:00:00。由于这一差距,当同一日期出现在 BD 中时,GMT 区域又过了21600 秒。

由于计算是相对于 GMT 完成的,您必须添加这些 21600 秒才能得到实际差异。

【讨论】:

    【解决方案2】:

    strtotime 在不同的时区给出不同的结果,因为它考虑了时区...

    来自strtotime's manual

    函数期望得到一个包含英文日期格式的字符串,并将尝试将该格式解析为 Unix 时间戳(自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数)

    此函数将使用 TZ 环境变量(如果可用)来计算时间戳。从 PHP 5.1.0 开始,有更简单的方法来定义所有日期/时间函数中使用的时区。该过程在date_default_timezone_get() 功能页面中进行了说明。

    看看mktime()

    从 PHP 5.1 开始,您可以在调用mktimestrtotime 之前使用date_default_timezone_set

    【讨论】:

    • 谢谢,我只是好奇,如果我使用 strtotime('2011-09-19 00:00:00') 它不应该只返回 'January 1 1970 00:00: 00' 和 '2011-09-19 00:00:00' ?为什么时区在这里是一个问题?我能得到一些能带来不同的东西吗?
    • +1 for mktime() 但它在几个部分需要参数,这很痛苦:(
    【解决方案3】:

    来自 PHP 手册:

    此函数将使用 TZ 环境变量(如果可用)来计算时间戳。自 PHP 5.1.0 起,有更简单的方法来定义所有日期/时间函数中使用的时区。该过程在 date_default_timezone_get() 函数页面中进行了说明。

    http://php.net/manual/en/function.strtotime.php

    【讨论】:

    • 谢谢,我已经用一个例子更新了问题,请看一下。
    【解决方案4】:

    在调用日期/时间函数之前使用date_default_timezone_set 来选择您想要工作的时区。

    http://www.php.net/manual/en/function.date-default-timezone-set.php

    【讨论】:

    • 谢谢,我已经用一个例子更新了问题,请看一下。
    【解决方案5】:

    来自PHP docsstrtotime

    此函数将使用 TZ 环境变量(如果可用) 计算时间戳。自 PHP 5.1.0 以来,有更简单的方法 定义在所有日期/时间函数中使用的时区。那 过程在 date_default_timezone_get() 函数页面中进行了说明。

    试试setting your own time zone

    【讨论】:

    • 谢谢,我已经用一个例子更新了问题,请看一下。
    【解决方案6】:

    我想可能每个 php 程序员都会有一次,这个函数会让他想真正了解 php 是如何与日期和时间函数一起工作的。

    当您尝试类似...错误...例如,假设今天此时是 2012 年 7 月 11 日 13:00:00 (2012-07-11 13:00:00) 时,这个函数很有趣) 然后你尝试使用 strtotime 来找到一天中完全相同的时刻,但明天:

    $x = strtotime('2012-07-12 13:00:00');
    
    $y = strtotime('+1 Day');
    
    $z = $x-$y;
    

    即使您忽略分钟和秒数,上述前 2 行的 $x 和 $y 也不会返回相同的内容,但如果您的服务器是在美国的某个地方,格林威治标准时间为 -5 小时,但您的浏览器在夏季从柏林调用此功能,格林威治标准时间为 +2 小时...哈哈,现在您可以了解 php 如何使用此功能;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多