时区概念:
时区是地球上具有统一的法定标准时间的区域。由于区域的法律定义可能千差万别且经常更改,因此通常需要数据库或查找表才能正确应用时区规则。
时区数据库
目前通常使用两种不同的时区数据库:
由Microsoft维护
- 在Windows平台实现。
- Windows API获取本机时区key示例:
"China Standard Time"
2.IANA /奥尔森时区数据库
也称为ZoneInfo,TZDB或TZ数据库,国际标准时区
-
在Linux,Mac,IOS,Andorid,JavaScript,Java,PHP和许多其他平台上广泛实现。
-
Android,IOS,MAC, Web API获取本机时区key示例:
"Asia/Shanghai"
时区信息
{
"alias": ["Asia/Chongqing", "Asia/Chungking", "Asia/Harbin", "CTT", "PRC"],
"offset": "480",
"text": "中国时间",
"id": "Asia/Shanghai",
"desc": "(GMT+08:00) 中国标准时间 - 上海"
}
offset: 时区偏移量,即本地时间和UTC之间的时间差。单位:分钟
注意偏移并不都是整数小时,比如:(GMT+08:40) (GMT+09:30)
问题一:
比如Android,ios,MAC使用系统接口获取到id:Asia/Shanghai。
但是Windows平台获取到的id是"China Standard Time",与时区信息列表里面的id不同。
所以需要用Windows时区与国际时区的映射表来确认当前国际时区id统一与后台交互
问题二:
offset代表偏移的分钟数,时区偏移量,即本地时间和UTC之间的时间差,对于UTC,时区的东边是正值。
但是有些平台获取到的offset却是正负相反的。
注意,JavaScript、Python和C返回的是UTC和本地时间的差数。 Java、C#和Ruby返回的是本地时间和UTC的差数。
问题三:
有些时区的偏移是会变的。因为这些地区采用了 夏令时 。
夏令时是指某个时区在春季将时间向前移动(通常为一小时),然后在秋季向后移动的时间段。
- 并非每个时区都会转换一小时。例如,
Australia/Lord_Howe
时区仅偏移30分钟。 - 世界各国政府经常改变夏令时的方式。不能假设当前规则过去总是适用或将来总是适用。
所以比较好的方案可能是从后台拉取时区列表,而后台要用脚本定期拉取国际标准时区信息进行变更。