国际化时区问题(国际化项目时区解决方案)
一、何为时区
https://baike.baidu.com/item/%E6%97%B6%E5%8C%BA/491122?fr=aladdin《Why We Have Time Zones》https://baike.baidu.com/tashuo/browse/content?id=aa3243d25266861aa52f989f&lemmaId=491122&fromLemmaModule=pcRight&lemmaTitle=%E6%97%B6%E5%8C%BA (二十四时区制的诞生渊源:美国铁路系统对于各地太阳时差异的解决)
https://24timezones.com/map_zh.php#/map(世界时钟 )https://www.beijing-time.org/shiqu/ (时分时差换算) 由于美国东西部铁路运行时间标准不统一,依靠正午来定位,造成火车时间运行表标准不一,同时时区标准化的过程带来生活、工作、公共资源统筹等时间调度困扰,时区
由于所处地理位置经纬度不同,划分出不同的时区。正式的时区划分包括24个时区,每一时区由一个英文字母表示。每个经度15°划分一个时区,有一个例外,每个时区有一条中央子午线;例如,GMT属于“z”区,因此其时间后通常添加后缀“Z”(口语中用后缀“Zulu”)。 [1]
公元1884年,在华盛顿召开的一次国际经度会议上,规定将全球划分为24个时区,分别是中时区(规定英国(格林尼治天文台旧址)为中时区(零时区))、东1-12区,西1-12区。每个时区横跨经度15度,时间正好是1小时。最后的东、西第12区各跨经度7.5度(有0时区,故东西12时区合为1时区),以东、西经180度为界。每个时区的中央经线上的时间就是这个时区内统一采用的时间,称为区时。相邻两个时区的时间相差1小时。
二、生活影响
1个国家或1个省份同时跨着2个或更多时区,为了照顾到行政上的方便,常将1个国家或1个省份划在一起。所以一些时区并不严格按南北直线来划分,而是按自然条件来划分。
例如,中国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间晚1小时。因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。凡向西走,每过一个时区,就要把表拨慢1小时(比如2点拨到1点);凡向东走,每过一个时区,就要把表拨快1小时(比如1点拨到2点)。并且规定英国(格林尼治天文台旧址)为本初子午线,即零度经线。 时区计算:计算的区时=已知区时-(已知区时的时区-要计算区时的时区)。(注:东时区为正,西时区为负) 例如:已知东京(东九区)时间为5月1日12:00,求北京(东八区)的区时。(北京时间=12:00-(9-8)=11:00,即北京时间为5月1日11:00。) 1912年,其时位于南京为中华民国时期中央气象局,将中国划分为五个时区。1919年(民国8年),中央观象台出版的《中华民国八年历书》刊登了中国各大城市地理纬度表和所位于的标准时区及其标准时与该城市地方平时的比较表,发表了中国划分五时区的计划,同时提出了标准时如何传递的授时问题。 1949年中华人民共和国成立后,这些时区在大陆不再采用。但国民政府迁台后,仍维持采用1912年的时区划分,台湾地区的标准时间继续称为“中原标准时间”。中国首都北京位于东八区,东八区的标准时就是中国的标准时间。
三、常见术语
UTC:世界协调时间,时间后面追加Z为UTC时间,Z为0时区标志,读zulu,18:25:35 UTC为18:25:35Z。 (yyyy-MM-dd’T’HH:mm:ss.SSS Z)UTC偏移量:+0800GMT:格林治标准世界,。1924年2月5日开始,每一个小时向全世界发放调时信息。CST:中国标准时间 UTC+8CET:欧洲中部时间 ,比UTC早1个小时的时区,冬季时间为UTC+1,夏季为UTC+2 ,大部分欧洲及北非国家使用的理论时区:严格按照经度划分的时区。法定时区:统一调整后使用的标准时间闰秒:在UTC中增加或减少1秒UNIX时间:从UTC1970年1月1日0时0分0秒至现在的秒数。 1970/1/1 00:00:00Z–>秒数(包含闰秒调整)。RFC-2822标准格式,形如:Sun Apr 08 2018 11:38:39 GMT+0800(CST)
ISO-8601标准格式,2018-04-08T11:38:39+08:00 日期用“-”相隔,与时间用“T”连接;2018-04-08T11:38:39Z Z代表UTC时间,Z也可写成00:00
四、时许需求
在时区应用中,在国际类公共场景中,为帮助客户调整时差,类似宾馆,常挂着几个主时区的表盘,便于客户意向地的时区时间,这里主要提现2种应用,辅助切换时区的各大表盘,同时在支撑酒店运营的各系统种所使用的本地化时间。2大需求:时差查询需求+本地化时间对场景的支持。
在应用中经常出现的时区场景如下,从中提炼出关于时间的一些场景函数。
三、应用中的时区设计
在应用设计中,面对应用各主要阶段(研发、测试、部署、运营)各个阶段的时区影响。 应用的运营大多是本地化运营,为了保证本地化时区应用的持久化属性,故在时区参数输入输入上,应该做本地化时区转换。而数据库及存储中尽量使用UTC-unix即时。方便应用系统在应用层进行时区的转换处理,输入本地化时区->UTC,输出为UTC->本地化时区。部分应用系统在国际化中,采取根据本地所在时区,动态转换UTC->本地时区处理,切换不同时区后,应用时间也会动态变化,由于UTC时间阅读的可视性较低,造成本地时区时间阅读不一致,产生歧义。(根据本地时区,实时转换时间输出,适合与时间关联的资源在不同时区均被承认的场景中)
图示三种方式中,第一种从存储、扩展方面既保持时间本身的时区特点,在各类时序存储中不失特性,同时兼顾业务的持久化特性,以UTC0时区存储,应用层可视业务情况转换为指定时区处理。
四、程序语言对时区的支持
1、在获取时间的时候,指定时区,切勿本地化默认获取,跨地区部署对接时,容易产生时间不一致。
2、与数据库方向对接时,关注服务器时区、客户端连接的时区 。防止出现时区错误。
3、时间计算时,按本地时区转换计算。