为什么strtotime在不同的时区给出不同的结果?

时间:2011-09-03 18:55:11

标签: php strtotime unix-timestamp date-conversion

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

修改

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

6 个答案:

答案 0 :(得分:7)

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

广义而言,2011-09-19 00:00:00几乎在6小时之后来到孟加拉国,在格林尼治标准时间区2011-09-19 00:00:00。由于存在此差距,当BD中显示相同日期时,GMT区域中已经过了另外21600秒。

由于计算是针对GMT进行的,因此您必须添加这些21600秒以获得实际差异。

答案 1 :(得分:6)

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

答案 2 :(得分:1)

从PHP手册:

  

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

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

答案 3 :(得分:1)

在拨打日期/时间功能之前使用date_default_timezone_set选择您要使用的时区。

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

答案 4 :(得分:1)

来自strtotime上的PHP docs

  

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

尝试setting your own time zone

答案 5 :(得分:0)

我想可能每个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;
即使你忽略了分钟和秒数,上面前两行中的$ x和$ y也不会返回同样的东西,但是如果你的服务器是服务器,那么$ z将在这两行之间的差异大约是25200或大约7小时在美国的某个地方,格林威治标准时间是-5小时,但是你在夏天浏览器从柏林调用这个函数,格林威治标准时间是+2小时......现在你可以了解php如何使用这个函数;)