License: Attribution-NonCommercial-ShareAlike 4.0 International
本文出自 Suzf Blog。 如未注明,均为 SUZF.NET 原创。
转载请注明:http://suzf.net/post/385
问题描述:
最近发现自动发送工作日报的那个脚本出现了问题, 发送是大昨天的内容.
可能是系统时间或是服务器时间配置不正确,下面开始逐步排查.
^_^[11:04:26][root@master01 ~]#date Thu Oct 22 11:05:33 CST 2015 ^_^[11:05:33][root@master01 ~]#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][root@master01 ~]#php test.php 2015-10-21 23:06:16 2015-10-20 23:06:16 ^_^[11:07:35][root@master01 ~]#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][root@master01 ~]#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