
(为什么 V2EX 的 markdown 不支持表格呢?)
# date -R Fri, 26 May 2017 11:48:48 +0800 # date -R Fri, 26 May 2017 11:48:48 +0800 

date_default_timezone_set("UTC"); ini_set("date.timezone","UTC"); echo "date_default_timezone_set: " . date_default_timezone_get()."<br>"; echo "date.timezone: " . ini_get("date.timezone")."<br>"; echo "time: " . time()."<br>"; echo "date: " . date( "Y-m-d H:i:s", time() ); date_default_timezone_set: UTC date.timezone: UTC time: 1495770528 date: 2017-05-26 03:48:48 (疑问,为什么这里输出的结果不一样?) date_default_timezone_set: UTC date.timezone: UTC time: 1495770528 date: 2017-05-26 11:48:48 (疑问,为什么这里输出的结果不一样?) 补充:
ini_set('display_errors', true); error_reporting(E_ALL); date_default_timezone_set("UTC"); echo date('Y-m-d H:i:s T') . "<br>"; echo date('Y-m-d H:i:s T', time()) . "<br>"; date_default_timezone_set("Asia/Shanghai"); echo date('Y-m-d H:i:s T') . "<br>"; echo date('Y-m-d H:i:s T', time()) . "<br>"; ini_set("date.timezone","UTC"); echo date('Y-m-d H:i:s T') . "<br>"; echo date('Y-m-d H:i:s T', time()) . "<br>"; ini_set("date.timezone","Asia/Shanghai"); echo date('Y-m-d H:i:s T') . "<br>"; echo date('Y-m-d H:i:s T', time()) . "<br>"; 以上代码输出的时间都是一样的。
折腾了大半天,终于解决了。 原因是:
在CentOS6里,时区配置文件 /etc/localtime 是一个单独的文件,CentOS6里修改时区的方法是:
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 网上的教程也大都是这样
服务器#2 (有问题的那台服务器)系统是 CentOS7
CentOS7里面的时区配置文件 /etc/localtime 默认是链接到 /usr/share/zoneinfo/Etc/UTC
所以如果还是用CentOS6的方法修改时间,那么/usr/share/zoneinfo/Etc/UTC就会被覆盖,导致 UTC时间出问题
CentOS7 里正确的修改时区的方法是:
timedatectl set-timezone "Asia/Shanghai" 或者
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 1 dangyuluo May 26, 2017 打印一遍所有的系统变量看看时区 |
2 oh May 26, 2017 via iPhone 正好相差 8 小时 |
3 xiaoz May 26, 2017 via iPhone 其中一个系统使用的格林威志,正好差 8 小时。 |
4 Yunhao May 26, 2017 via iPhone 时间戳是一样的,那时间肯定是相同的。看看系统默认时区吧,一个是 UTC 另一个可能是 Asia/Shanghai |
7 forelegance May 26, 2017 这个问题,之前有人问过的。timezone,timezone, timezone |
9 lenmore May 26, 2017 检查一下 cat /etc/sysconfig/clock ll /etc/localtime 是否一致。 参考: http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/set-time.html |
10 infong May 26, 2017 最后一条用 date('c'); 输出看看。 另外再看看 /etc/timezone 与 /etc/adjtime,如果有的话。 估计是 locale 或者是「硬件时间」引起的。 |
11 gdtv OP @lenmore 在 服务器#1 (正常的服务器)上面: [root@xxx ~]# cat /etc/sysconfig/clock ZOnE="UTC" [root@xxx ~]# ll /etc/localtime -rw-r--r-- 1 root root 388 May 26 13:03 /etc/localtime 在 服务器#2 (不正常的服务器)上面: [root@xxx ~]# cat /etc/sysconfig/clock cat: /etc/sysconfig/clock: No such file or directory [root@xxx ~]# ll /etc/localtime lrwxrwxrwx. 1 root root 29 Feb 3 03:52 /etc/localtime -> ../usr/share/zoneinfo/Etc/UTC 这是什么意思呢? 看不懂。 |
12 vvchen May 26, 2017 用 dpkg-reconfigure tzdata ( debian /ubuntu )或者 timedatectl set-timezone ( centos )统一设置下时区 |
13 gdtv OP @infong 测试代码: date_default_timezone_set("UTC"); ini_set("date.timezone","UTC"); echo "date_default_timezone_set: " . date_default_timezone_get()."<br>"; echo "date.timezone: " . ini_get("date.timezone")."<br>"; echo date('c'); 在 服务器#2 (不正常的服务器)上显示结果: date_default_timezone_set: UTC date.timezone: UTC 2017-05-26T13:32:29+08:00 在 服务器#2 (不正常的服务器)上面, 文件 /etc/timezone 不存在,文件 /etc/adjtime 的内容是: 0.0 0 0.0 0 UTC |
14 gdtv OP @vvchen 在 服务器#2 (不正常的服务器)上执行: timedatectl set-timezone UTC timedatectl set-timezone "UTC" timedatectl set-timezone "Asia/Shanghai" 对上面帖子里的 php 代码的执行结果无影响 |
15 hcivincentchan May 26, 2017 两台服务器的操作系统版本和 php 版本是什么? |
16 gdtv OP @hcivincentchan 服务器#1 操作系统: CentOS 6.6 32bit 服务器#2 操作系统: CentOS 7.3 64bit 服务器#1 PHP: 5.4.39 服务器#2 PHP: 5.6.30 |
17 yuzunzhi May 27, 2017 centos 7 请使用 timedatectl 命令查看时区^_^ |