(为什么 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 2017-05-26 12:16:54 +08:00
打印一遍所有的系统变量看看时区
|
2
oh 2017-05-26 12:25:58 +08:00 via iPhone
正好相差 8 小时
|
3
xiaoz 2017-05-26 12:34:45 +08:00 via iPhone
其中一个系统使用的格林威志,正好差 8 小时。
|
4
Yunhao 2017-05-26 12:40:41 +08:00 via iPhone
时间戳是一样的,那时间肯定是相同的。看看系统默认时区吧,一个是 UTC 另一个可能是 Asia/Shanghai
|
7
forelegance 2017-05-26 12:57:01 +08:00
这个问题,之前有人问过的。timezone,timezone, timezone
|
9
lenmore 2017-05-26 13:00:33 +08:00
检查一下
cat /etc/sysconfig/clock ll /etc/localtime 是否一致。 参考: http://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/set-time.html |
10
infong 2017-05-26 13:03:46 +08:00
最后一条用 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 2017-05-26 13:33:09 +08:00
用 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 2017-05-26 16:46:02 +08:00
两台服务器的操作系统版本和 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 2017-05-27 10:16:38 +08:00
centos 7 请使用 timedatectl 命令查看时区^_^
|