Fork me on GitHub
Suzf  Blog

PHP 获取的时间和系统的时间不一致

问题描述:
最近发现自动发送工作日报的那个脚本出现了问题, 发送是大昨天的内容.
可能是系统时间或是服务器时间配置不正确,下面开始逐步排查.

^_^[11:04:26][[email protected] ~]#date
Thu Oct 22 11:05:33 CST 2015
^_^[11:05:33][[email protected] ~]#cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
#UTC=true
#ARC=false

<?php
//date_default_timezone_set('UTC');
date_default_timezone_set('CST/8.0');

$today = date('Y-m-d H:i:s');
$yesterday = date('Y-m-d H:i:s',time()-86400);
echo "$today\n";
echo "$yesterday";
?>


^_^[11:06:09][[email protected] ~]#php test.php
2015-10-21 23:06:16
2015-10-20 23:06:16

^_^[11:07:35][[email protected] ~]#date -R
Thu, 22 Oct 2015 11:10:14 +0800


奇le个怪le, 系统区时的时间是对的,为啥时间不对呢?
再来看一下php 的 timezone

咔咔,居然错误在这里

[Date]
; Defines the default timezone used by the date functions
; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone
date.timezone = 'Asia/Shanghai'
date.timezone = 'America/New_York'

将第二个注释掉再来看,这下对了O(∩_∩)O哈!

^_^[11:15:06][[email protected] ~]#php test.php
2015-10-22 11:15:12
2015-10-21 11:15:12

reference:
发现时区确实错误,进行修改
/bin/cp /etc/localtime{,.old}
/bin/cp /usr/share/zoneinfo/Asia/Shanghai      /etc/localtime

命令行修改时区
tzselect

一些概念:

1、硬件时钟(也叫BIOS时钟、CMOS时钟)
和CPU和系统无关的,单独由一个电池和晶振运行的时钟,即使关机也会走。
硬件时钟只有当系统启动的时候才会读取。
hwclock --show # 显示硬件时间
hwclock -s     # 系统时钟和硬件时钟同步

2、系统时间
Linux内核启动以后的时间,保持一个时间中断,用1970年1月1日00:00:00开始的秒数计数。这是我们平时看到时间。

3、时区
在某个时刻,世界各地的人,看到的时间都不同的。比如你同样适用gmail,大陆的人看到是 20:00,北美的人,可能是07:00.时刻还是一样的,但是由于时区不同,看到的时间显示就不同。
同样,我们机器里,可以系统时间一样的,但是不同的用户,可以设置不同的时区,看到的时间也不同。当然,系统本身有一个缺省时区。
在Redhat或者CentOS下,是使用  /etc/sysconfig/clock里的 ZONE="Asia/Shanghai" 选项配置的

4、UTC/GMT还是本地时间
系统启动的时候,使用/sbin/hwclock 从硬件时钟读取时间,关机的时候,会回写硬件时钟。
这里就有一个问题,读取和回写的时候,采用什么标准,是UTC还是本地时间?
一般情况下,都使用UTC/GMT,这样可以自动处理夏令时间(中国地方太大,已经作废)。
使用UTC的唯一坏处,是当你的计算机是多系统时,如果启动Windows,会导致时间不对。

5、时间同步
一般使用 ntp 协议进行同步,可以保持毫秒级的时差。

http://php.net/manual/zh/function.date.php
http://bbs.csdn.net/topics/390023846