我不知道为什么PHP中的strtotime()
在不同的时区返回不同的结果,即使相同的日期作为参数给出,有人知道答案吗?我也想知道,我可以做类似的任务(转换datetime
到int
做计算容易)与另一个函数在不同的时区给出相同的结果?
一个例子:如果我使用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开始,您可以在调用mktime
或strtotime
之前使用date_default_timezone_set
从PHP手册:
http://php.net/manual/en/function.strtotime.php该函数将使用TZ环境变量(如果可用)来计算时间戳。自PHP 5.1.0以来,有了更简单的方法来定义跨所有日期/时间函数使用的时区。该过程在date_default_timezone_get()函数页中有解释。
在调用日期/时间函数之前使用date_default_timezone_set
来选择要在哪个时区工作。
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是如何使用这个函数的了;)