php的时间问题 时区

时区问题的产生

如果你在格林威治时间 那么没有问题 不会遇到这样的问题,但是如果你是东八区的居民,而且你经常使用一个PHP的时间字符转换方法strtotime(),那么你要注意下面我所说的。

表象

1
2
3
4
5
6
7
8
echo strtotime(date('Y-m'))."\r\n";
ini_set('date.timezone','PRC');
echo date('Y-m')."\r\n";
echo strtotime(date('Y-m'))."\r\n";

echo 1509494400 - 1509465600;
echo "\r\n";
echo 28800/8

你会发现输出结果如下

1
2
3
4
5
1509494400
2017-11
1509465600
28800
3600

哦 为什么会这样?

原因

  1. 格林威治时间比东八区的时间,完了8个小时
  2. strtotime()方法转换一个日期的时候是计算是从 1970年1月1日 到指定日期的秒数。需要注意的是 这个秒数是格林威治时间1970年1月1日 到指定日期的秒数,如果是东八区要减去相应的秒数,如果是西八区 要增加相应的秒数
  3. 在东八区获取time()的时候获取的是系统时间,而这个时间是东八区的时间。
  4. 23 中的参照时间是不同的,所以产生了时间问题。

结果

于是 在东八区的我们发现 我们的定时器是按照东八区的0点开始执行的,但是定时器中指处理指定日期的脚本就出了问题。

总结

为同一时间标准,如果你的机器只在东八区,建议设置标准时间为东八区的时间,PHP中也要在脚本中处理好,建议在所有的入口文件中设置好时区,虽然php.ini中也可以设置,但是不能保证你拥有修改的权限。

  • Post author: hainuo
  • Post link: php-date-in-timezone
  • Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.