V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gdtv
V2EX  ›  PHP

请问这两台服务器的 date( "Y-m-d H:i:s", time() ) 执行结果为什么不一样?

  •  
  •   gdtv · 2017-05-26 12:12:58 +08:00 · 3367 次点击
    这是一个创建于 2526 天前的主题,其中的信息可能已经有所发展或是发生改变。

    (为什么 V2EX 的 markdown 不支持表格呢?)

    服务器#1 的系统时间:

    # date -R
    Fri, 26 May 2017 11:48:48 +0800
    

    服务器#2 的系统时间:

    # date -R
    Fri, 26 May 2017 11:48:48 +0800
    

    服务器#1 的 phpinfo()结果:

    Imgur

    服务器#2 的 phpinfo()结果:

    Imgur

    PHP 代码:

    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() );
    

    服务器#1 代码执行结果:

    date_default_timezone_set: UTC
    date.timezone: UTC
    time: 1495770528
    date: 2017-05-26 03:48:48 (疑问,为什么这里输出的结果不一样?)
    

    服务器#2 代码执行结果:

    date_default_timezone_set: UTC
    date.timezone: UTC
    time: 1495770528
    date: 2017-05-26 11:48:48 (疑问,为什么这里输出的结果不一样?)
    
    第 1 条附言  ·  2017-05-26 12:56:26 +08:00

    补充:

    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>";
    

    以上代码输出的时间都是一样的。

    第 2 条附言  ·  2017-05-26 13:07:17 +08:00
    上面补充说明的代码是在 服务器#2 上输出的时间都是一样的,都是+8 区的时间。
    第 3 条附言  ·  2017-05-26 19:41:10 +08:00

    折腾了大半天,终于解决了。 原因是:

    在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
    
    17 条回复    2017-05-27 10:16:38 +08:00
    dangyuluo
        1
    dangyuluo  
       2017-05-26 12:16:54 +08:00
    打印一遍所有的系统变量看看时区
    oh
        2
    oh  
       2017-05-26 12:25:58 +08:00 via iPhone
    正好相差 8 小时
    xiaoz
        3
    xiaoz  
       2017-05-26 12:34:45 +08:00 via iPhone
    其中一个系统使用的格林威志,正好差 8 小时。
    Yunhao
        4
    Yunhao  
       2017-05-26 12:40:41 +08:00 via iPhone
    时间戳是一样的,那时间肯定是相同的。看看系统默认时区吧,一个是 UTC 另一个可能是 Asia/Shanghai
    gdtv
        5
    gdtv  
    OP
       2017-05-26 12:55:13 +08:00
    @xiaoz 上面已经有说明,两个系统的时区都是 +0800
    gdtv
        6
    gdtv  
    OP
       2017-05-26 12:56:39 +08:00
    @Yunhao 上面已经有说明,两个系统的时区都是 +0800
    forelegance
        7
    forelegance  
       2017-05-26 12:57:01 +08:00
    这个问题,之前有人问过的。timezone,timezone, timezone
    gdtv
        8
    gdtv  
    OP
       2017-05-26 12:57:08 +08:00
    @dangyuluo 系统变量是$_SERVER 吗? 我看了这里面好像没有时区相关的东西
    lenmore
        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
    infong
        10
    infong  
       2017-05-26 13:03:46 +08:00
    最后一条用 date('c'); 输出看看。
    另外再看看 /etc/timezone 与 /etc/adjtime,如果有的话。
    估计是 locale 或者是「硬件时间」引起的。
    gdtv
        11
    gdtv  
    OP
       2017-05-26 13:28:47 +08:00
    @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

    这是什么意思呢? 看不懂。
    vvchen
        12
    vvchen  
       2017-05-26 13:33:09 +08:00
    用 dpkg-reconfigure tzdata ( debian /ubuntu )或者 timedatectl set-timezone ( centos )统一设置下时区
    gdtv
        13
    gdtv  
    OP
       2017-05-26 13:34:38 +08:00
    @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
    gdtv
        14
    gdtv  
    OP
       2017-05-26 13:45:02 +08:00
    @vvchen 在 服务器#2 (不正常的服务器)上执行:

    timedatectl set-timezone UTC
    timedatectl set-timezone "UTC"
    timedatectl set-timezone "Asia/Shanghai"

    对上面帖子里的 php 代码的执行结果无影响
    hcivincentchan
        15
    hcivincentchan  
       2017-05-26 16:46:02 +08:00
    两台服务器的操作系统版本和 php 版本是什么?
    gdtv
        16
    gdtv  
    OP
       2017-05-26 16:54:29 +08:00
    @hcivincentchan

    服务器#1 操作系统:
    CentOS 6.6 32bit

    服务器#2 操作系统:
    CentOS 7.3 64bit

    服务器#1 PHP:
    5.4.39

    服务器#2 PHP:
    5.6.30
    yuzunzhi
        17
    yuzunzhi  
       2017-05-27 10:16:38 +08:00
    centos 7 请使用 timedatectl 命令查看时区^_^
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3175 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:36 · PVG 22:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.