`
lzzy_alex
  • 浏览: 29082 次
社区版块
存档分类
最新评论

时区排错

 
阅读更多

时区划分

由于地球自转的关系(自西向东),所以东边比西边先看到太阳。在同一时刻东边可能是清晨,西边可能是深夜,对这一时刻的描述就会造成混乱,即时间定义的混乱。

 

为了克服时间上的混乱,于1884年华盛顿召开子午线会议,规定将全球划分为24个时区,东西各12个,以英国(格林尼治天文台旧址)为零时区,东1-12区,西1-12区,每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度,以东、西经180度为界。

 

每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时,相邻两个时区的时间相差1小时。例如,中国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间迟1小时。因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。凡向西走,每过一个时区,就要把表拨慢1小时(比如2点拨到1点);凡向东走,每过一个时区,就要把表拨快1小时(比如1点拨到2点)。并且规定英国(格林尼治天文台旧址)为本初子午线,即零时(24时)经线。

 

中国领土横跨5个时区,为使用方便,统一使用东八区时间,即北京时间为准。

 

格林尼治时间GMT

Greenwich Mean Time,GMT是英国的标准时间,指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线是被定义在通过那里的经线,也是世界各地时间的参考标准。

 

格林尼治时间又叫世界时,在对重大事件记录时,使用地方时容易造成混乱,所以往往采用格林尼治时间记录,一旦知道了格林尼治时间,通过换算就可以知道地方时了,比如某事件发生在格林尼治时间上午9 时,我国在英国东面,北京时间比格林尼治时间早7或8小时,我们就可以知道这次事情发生在相当于北京时间当日16或17时。

 

世界协调时UTC

UTC指的是Coordinated Universal Time,是经过平均太阳时(以格林威治时间GMT为准)、地轴运动修正后的新时标以及以「秒」为单位的国际原子时所综合精算而成的时间,计算过程相当严谨精密,因此若以「世界标准时间」的角度来说,UTC比GMT来得更加精准。其误差值必须保持在0.9秒以内,若大于0.9秒则由位于巴黎的国际地球自转事务中央局发布闰秒,使UTC与地球自转周期一致。所以基本上UTC的本质强调的是比GMT更为精确的世界时间标准。

 

夏令时DST

DST是Daylight Saving Time的缩写,称为阳光节约时,在我国称为夏时制,又称夏令时,是一种为节约能源而人为调整地方时间的制度。有些国家DST的使用时间较长,(如美国长达7个月)跨越了春夏秋等三个季节,因此简单地用夏时制的概念已经不能完全表达DST的确切含义了,所以有人也称其为节能时。

 

夏令时就是利用夏季天亮得早这一自然现象,人为地将时间提前一小时。这样就可以使人们早起早睡,以充分利用光照资源,减少照明时间,从而节约照明用电。

 

CST

CST可以表示为美国,澳大利亚,中国,古巴的标准时间:

美国中部时间:Central Standard Time (USA) UT-6:00

澳大利亚中部时间:Central Standard Time (Australia) UT+9:30

中国标准时间:China Standard Time UT+8:00

古巴标准时间:Cuba Standard Time UT-4:00

 

程序中可能产生的问题

生产工作中,可能由于操作系统、JVM、程序或数据库时区不一致,导致时间与预期不一样。这需要排查相应的时区设置:

 

操作系统时区

>date
Thu Nov 26 15:24:42 CST 2015
>date -R
Thu, 26 Nov 2015 15:25:00 +0800

表明这是一个东八区中国标准时间(China Standard Time UT+8:00)。

 

>cat /etc/sysconfig/clock 或者 cat /etc/localtime
ZONE="Asia/Shanghai"

查看系统时区,其中"Asia/Shanghai"为时区文件名,位于/usr/share/zoneinfo/Asia/Shanghai

 

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

重置系统时区, 即以"Asia/Shanghai"文件的时区作为系统时区。

 

JVM时区

缺省情况下,JVM会以当前系统时区为默认时区,也可以通过调整启动参数定义时区:-Duser.timezone=GMT+08,在tomcat中可以修改catalina.sh文件:

 

vi catalina_home/bin/catalina.sh
JAVA_OPTS="-Duser.timezone=GMT+08"

 

程序时区

TimeZone zone = TimeZone.getTimeZone("GMT+8:00");
TimeZone.setDefault(zone);

 

 

数据库时区(MySQL)

show variables like '%time_zone%';
system_time_zone  CST
time_zone         SYSTEM
 
修改文件my.cnf,在 [mysqld] 之下加入
default-time-zone = '+8:00'

 

参阅资料

时区:http://www.douban.com/note/147740972

Linux时区设置:http://www.cnblogs.com/xxpal/articles/816693.html

MySQL时区修正:http://blog.itpub.net/23490154/viewspace-1062503

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics