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


Why does strtotime give different result in different timezone?

我不知道为什么PHP中的strtotime()在不同的时区返回不同的结果,即使相同的日期作为参数给出,有人知道答案吗?我也想知道,我可以做类似的任务(转换datetimeint做计算容易)与另一个函数在不同的时区给出相同的结果?

编辑:

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

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

在更广泛的意义上,2011-09-19 00:00:00几乎在6小时后到达孟加拉国,它是格林尼治时区的2011-09-19 00:00:00。由于这个时间差,当相同的日期出现在BD中时,GMT区又过了一个21600秒。

由于计算是根据GMT完成的,因此必须将这些21600秒相加才能得到实际的差值。

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

来自strtotime的手册:

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

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

请看mktime()

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

从PHP手册:

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

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

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

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

From PHP docs on strtotime:

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

我想可能每个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是如何使用这个函数的了;)