由夏时令引起的java世界时间不一致问题

上周服务器在结算竞技场的时候发生了结算在积分清零只后的问题,但实际上服务器代码里的时间是写死的,逻辑先后在内网测试的时候是没有问题的,所以发生这一现象实在令人百思不得解。

后来查看日志,发现清零时间确实提早了一个小时,那么问题来了,这一个小时呢?和时区有关么?

很幸运,策划组里有个在美国待过一阵的伙伴,他找到了问题-夏时令。

什么是夏时令

夏令时的英文是『Daylight Saving Time』,顾名思义,其目的是节约能源,那么它是怎么实现节能的呢。

在夏天:

这里写图片描述

橙色代表白天,绿色代表非睡眠时间。夏天昼长夜短,注意到,把作息提前一小时之后,需要开灯的时间就少了一小时。

在冬天:

这里写图片描述

冬天昼短夜长,调整作息并没有什么作用。

而冬季调整作息也没用的原因是:早上天还是黑的,所以就算作息提前,早上还是得开灯…

于是乎:

(1)西方人拨时钟

美国夏时制实行与否,完全由各州各郡自己决定。美国不实行夏令时的地区包括:
1)亚利桑那州的大部分地区不使用夏令时,但是屬納瓦霍族保留區的地區使用夏令时
2)夏威夷州
3)波多黎各和维京群岛
4)美属萨摩亚、關島和北馬里亞納群島

美國原本於每年4月的第一個星期日凌晨2時起至10月的最後一個星期日凌晨2時實施夏令時間;但經美國國會2005年通過的能源法案,自2007年起延長夏令時間,開始日期從每年4月的第一個星期日,提前到3月的第二個星期日,結束日期從每年10月的最後一個星期日,延後到11月的第一個星期日。

加拿大夏时制實施日期一向跟美國一致,在美國2005年修法後,加拿大各省也在2007年3月美新法實施前完成修法。加國好幾個處於時區邊界的地區(包括薩斯喀徹溫省大部分地區和其他幾個較小地區)不實施夏时制。另外,加國春秋撥鐘時刻由各省自行決定,但在紐芬蘭2011年修法以後,現在全國都跟美國一樣在凌晨2時撥鐘。

大家想感受一下冬令时的话,在系统->通用->日期与时间里 关闭自动设置,然后打开时区搜索 哈瓦那(古巴的一个时区),然后将时间调整到2015年11月1日,00:59。等一分钟时间会自动跳到00:00(不会死循环的…)

(2)中国古代是“改钟”

在古代中国,冬至白天45刻,随后每九天加一刻,至夏至65刻,然后每九天减一刻。钦天监每九天换一次漏尺。

(3)中国现代主要是改作息时间

曾经我国也实行过夏时令,实施夏时制方案后,当年全国实际节约用电6.27亿度,1987年为7.54亿度,从节能角度讲,效果是非常不错的。另一方面,自建国以来,就不断有人提出夏时制的方案,国务院长期搁置这一建议的原因是,反对的呼声更加强烈,比如铁路、民航部门强调时间表每年变动两次,会显著增加运营成本。另外有观点认为,夏时制对低纬度地区的作用有限,反而会给当地居民造成诸多生活不便。

夏令时实施前后,正方和反方的态度没有变化,所描述的情况也基本属实,那么,为什么国务院要到1986年才采纳夏令时的意见,又在1992年初,否定了之前的决策?分析并解决这个问题,我觉得应该抓住最大的一个变量:电力供应。

由于改革开放和重工业的飞速发展,到1986年,中国的电力供应缺口达到了两成左右,再找不到短期解决办法的情况下,国务院通盘考虑,决定采纳此前弃之不用的夏令时方案。1991年,秦山核电站正式启用,在建的大亚湾核电站也将在两年后投入商业运行。当时我国电力企业的技术、设备的更新换代工作初具成果,建成了多座水电站,我国的发电方式日益多元化,电力供应问题得到了一定程度的缓解,此时,反对夏时制的力量再次占据上风。

几年后,电力紧张再次席卷全国,2007年秋天,国家能源研究所曾进行过全国调研,最后的结论是,当前采用夏时制,只会对照明用电有所效果,相比较而言,采用弹性工作制,普及节电设备,更有利于实现节能减排的目标,由此,夏时制在中国短时间内没有翻身的可能了。

服务器解决方案

这里先介绍几个概念:

GMT
GMT 是 Greenwich Mean Time 的缩写,译为中文为“格林威治标准时间”或“格林尼治标准时间”,直译的话,可译为“格林威治平时”或“格林尼治平时”。这里的格林威治位于英国伦敦东南方向的泰晤士河畔,美国也有个格林威治镇,不过与时间没关系。

UTC
UTC 是 Coordinated Universal Time 的缩写,译为中文为“世界标准时间”,直译的话,可译为“协调通用时间”或“协调世界时间”。目前来说也就是指 GMT 时间。为什么说目前就是指 GMT 时间呢?因为本初子午线(子午线即经线,本初子午线即 0 度经线)其实穿过的是沙特阿拉伯西边的麦加,而不是英国的格林威治。当时英国皇家学会暂时确定格林威治为本初子午线的穿过点﹐加之英国正是兴旺发达时期,全世界就将错就错,用到现在。说不定哪天改为麦加时间为标准时间也不是没有可能。所以我们一般使用 UTC,而不是 GMT。

PDT
PDT 是 Pacific Daylight Time 的缩写,译为中文为“太平洋夏令时间”,比 UTC 时间晚 7 小时。Google 曾在其 AdSense 中提到“在 09-6-13,我们的工程师会在 PDT 大约 上午10:00 到 下午2:00 对网站进行维护。”
其实除了 PDT 时间,北美地区还有很多时间:
美国夏季始于每年4月的第1个周日,止于每年10月的最后一个周日。夏令时比正常时间早一小时, 与PDT时间相对应的是PST , Pacific Standard Time 。 夏时制结束后就是PST

NST - Newfoundland Standard Time 纽芬兰标准时间
NDT - Newfoundland Daylight Time 纽芬兰夏令时间
AST - Atlantic Standard Time 大西洋标准时间
ADT - Atlantic Daylight Time 大西洋夏令时间
EST - Eastern Standard Time 东部标准时间
EDT - Eastern Daylight Time 东部夏令时间
CST - Central Standard Time 中部标准时间
CDT - Central Daylight Time 中部夏令时间
MST - Mountain Standard Time 山地标准时间
MDT - Mountain Daylight Time 山地夏令时间
PST - Pacific Standard Time 太平洋标准时间
PDT - Pacific Daylight Time 太平洋夏令时间
AKST - Alaska Standard Time 阿拉斯加标准时间
AKDT - Alaska Daylight Time 阿拉斯加夏令时间
HAST - Hawaii-Aleutian Standard Time 夏威夷-阿留申标准时间
HADT - Hawaii-Aleutian Daylight Time 夏威夷-阿留申夏令时间

PST
PST是太平洋标准时间(西八区),与北京时间(东八区)时差-16个小时,也就是北京时间减去16就是PST时间。而PDT比PST早1个小时,就是说PDT与北京时间时差为-15小时

夏令时
Daylight Saving Time 或 Daylight Time。
美国和加拿大原本于每年10月的最后一个星期日凌晨2时起实施冬令时间;4月的第一个星期日凌晨2时起,恢复夏令时间。
但是根据 美国国会最新通过的能源法案,为加强日光节约,自2007年起延长夏令时间,开始日期从每年4月的第一个星期日,提前到3月的第二个星期日,结束日期从每年10月的最后一个星期日,延后到11月的第一个星期日。换言之,冬令时间将缩短约一个月。之所以安排在周日,是为了便于生活的调整不至于受到较大的影响。
Linux 系统改变时区的命令 timeconfig
或者cp /usr/share/zoneinfo/America/Los_Angeles /etc/localtime

2010年美国夏令时: 美国2010年夏令时将于3月14日当地时间早上02:00开始
届时时间服务器会从01:59:59 自动跳到03:00:00

对于java中的时间:

  1. 原来Java中不是每天都是标准的24个小时,可能是23,也可能是25
  2. 日期的计算,使用Calendar提供的API,是不会出差错的,简单的new Date(long milliseconds)可能并不靠谱
  3. 来自多方协作的项目,最好使用统一的时间标准,例如系统时间,或是统一时区
  4. 好消息是,从1992年开始,中国已经停止使用夏令时。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值