请问这两台服务器的 date( "Y-m-d H:i:s", time() ) 执行结果为什么不一样? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gdtv
V2EX    PHP

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

  •  
  •   gdtv May 26, 2017 4201 views
    This topic created in 3261 days ago, the information mentioned may be changed or developed.

    (为什么 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 (疑问,为什么这里输出的结果不一样?) 
    Supplement 1    May 26, 2017
    /div>

    补充:

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

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

    Supplement 2    May 26, 2017
    上面补充说明的代码是在 服务器#2 上输出的时间都是一样的,都是+8 区的时间。
    Supplement 3    May 26, 2017

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

    在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 replies    2017-05-27 10:16:38 +08:00
    dangyuluo
        1
    dangyuluo  
       May 26, 2017
    打印一遍所有的系统变量看看时区
    oh
        2
    oh  
       May 26, 2017 via iPhone
    正好相差 8 小时
    xiaoz
        3
    xiaoz  
       May 26, 2017 via iPhone
    其中一个系统使用的格林威志,正好差 8 小时。
    Yunhao
        4
    Yunhao  
       May 26, 2017 via iPhone
    时间戳是一样的,那时间肯定是相同的。看看系统默认时区吧,一个是 UTC 另一个可能是 Asia/Shanghai
    gdtv
        5
    gdtv  
    OP
       May 26, 2017
    @xiaoz 上面已经有说明,两个系统的时区都是 +0800
    gdtv
        6
    gdtv  
    OP
       May 26, 2017
    @Yunhao 上面已经有说明,两个系统的时区都是 +0800
    forelegance
        7
    forelegance  
       May 26, 2017
    这个问题,之前有人问过的。timezone,timezone, timezone
    gdtv
        8
    gdtv  
    OP
       May 26, 2017
    @dangyuluo 系统变量是$_SERVER 吗? 我看了这里面好像没有时区相关的东西
    lenmore
        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
    infong
        10
    infong  
       May 26, 2017
    最后一条用 date('c'); 输出看看。
    另外再看看 /etc/timezone 与 /etc/adjtime,如果有的话。
    估计是 locale 或者是「硬件时间」引起的。
    gdtv
        11
    gdtv  
    OP
       May 26, 2017
    @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  
       May 26, 2017
    用 dpkg-reconfigure tzdata ( debian /ubuntu )或者 timedatectl set-timezone ( centos )统一设置下时区
    gdtv
        13
    gdtv  
    OP
       May 26, 2017
    @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
       May 26, 2017
    @vvchen 在 服务器#2 (不正常的服务器)上执行:

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

    对上面帖子里的 php 代码的执行结果无影响
    hcivincentchan
        15
    hcivincentchan  
       May 26, 2017
    两台服务器的操作系统版本和 php 版本是什么?
    gdtv
        16
    gdtv  
    OP
       May 26, 2017
    @hcivincentchan

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

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

    服务器#1 PHP:
    5.4.39

    服务器#2 PHP:
    5.6.30
    yuzunzhi
        17
    yuzunzhi  
       May 27, 2017
    centos 7 请使用 timedatectl 命令查看时区^_^
    About     Help     Advertise     Blog     API     FAQ     Solana     5418 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 71ms UTC 07:38 PVG 15:38 LAX 00:38 JFK 03:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86