原理讲解
在美国,夏令时从3月的第二个星期日开始,到11月的第一个星期日结束,并在当地时间凌晨2点更改时间。 春天开始施行夏令时时,在当天的凌晨2点人们要把时钟拨到3点,在秋天结束夏令时时,时钟要从凌晨2点拨到1点。 每年的夏令时时间总共持续34周(238天),约占全年的65%。
时区划分:全球共分为 24 个时区,以本初子午线(0° 经线)为基准,向东、向西各划分 12 个时区。每个时区相差 1 小时,东边的时区时间比西边的早。
计算时差:北京时间与圣何塞所在的太平洋时间相差的时区数为8−(−8)=16个时区,所以时差为 16 小时。当北京时间是上午 8 点时,圣何塞时间是前一天的下午 4 点。
进行时区转换时,要先确定两个地区所在的时区,计算出时区差,再根据 “东加西减” 的原则进行计算。如果涉及夏令时,还要根据具体情况进行调整。
IANA时区数据库包含600+时区,完整时区列表可参考:
Timezone Database
。
CST 可能指:中国标准时间(UTC+8)/美国中部标准时间(UTC-6);IST 可能指:印度标准时间(UTC+5:30)/爱尔兰夏令时(UTC+1)
时区调整时,物理机的Location会改变,时区由UTC+2变为UTC+1。所以海外部署服务时间处理都需要携带时区信息,使用RFC3339这种格式来操作,或者Location都设为UTC0来服务。
Go实现
in, err := time.ParseInLocation(time.DateTime, input, cst)
in.In(loc).Format(time.DateTime)
时区表
UTC偏移
时区缩写
代表地区
备注
UTC-12:00
IDLW
国际日期变更线西侧
仅少数无人岛屿
UTC-11:00
SST
美属萨摩亚
UTC-10:00
HST
夏威夷
美国夏威夷州
UTC-09:00
AKST
阿拉斯加(标准时间)
美国阿拉斯加大部分地区
UTC-08:00
PST
太平洋标准时间
美国洛杉矶、加拿大温哥华
UTC-07:00
MST
山地标准时间
美国丹佛、加拿大埃德蒙顿
UTC-06:00
CST
中部标准时间
美国芝加哥、墨西哥城
UTC-05:00
EST
东部标准时间
美国纽约、加拿大蒙特利尔
UTC-04:00
AST
大西洋标准时间
加拿大哈利法克斯、智利圣地亚哥
UTC-03:30
NST
纽芬兰标准时间
加拿大纽芬兰
UTC-03:00
ART
阿根廷时间
阿根廷、巴西部分城市
UTC-02:00
FNT
费尔南多·迪诺罗尼亚群岛
巴西离岛
UTC-01:00
AZOT
亚速尔群岛
葡萄牙属地
UTC±00:00
GMT/UTC
基准时区
英国伦敦、冰岛、西非
UTC+01:00
CET
中欧时间
法国巴黎、德国柏林
UTC+02:00
EET
东欧时间
希腊雅典、埃及开罗
UTC+03:00
MSK
莫斯科时间
俄罗斯西部、土耳其伊斯坦布尔
UTC+03:30
IRST
伊朗标准时间
伊朗
UTC+04:00
GST
海湾标准时间
阿联酋迪拜、格鲁吉亚
UTC+04:30
AFT
阿富汗时间
阿富汗
UTC+05:00
PKT
巴基斯坦标准时间
巴基斯坦、马尔代夫
UTC+05:30
IST
印度标准时间
印度、斯里兰卡
UTC+05:45
NPT
尼泊尔时间
尼泊尔
UTC+06:00
BDT
孟加拉时间
孟加拉国、哈萨克斯坦西部
UTC+06:30
MMT
缅甸时间
缅甸、科科斯群岛
UTC+07:00
ICT
中南半岛时间
泰国曼谷、越南河内
UTC+08:00
CST
中国标准时间
北京、新加坡、马来西亚
UTC+09:00
JST
日本标准时间
东京、韩国首尔
UTC+09:30
ACST
澳大利亚中部标准时间
澳大利亚阿德莱德
UTC+10:00
AEST
澳大利亚东部标准时间
悉尼、关岛
UTC+10:30
LHST
豪勋爵岛时间
澳大利亚豪勋爵岛
UTC+11:00
NCT
新喀里多尼亚时间
太平洋西南部岛屿
UTC+12:00
NZST
新西兰标准时间
奥克兰、斐济
UTC+12:45
CHAST
查塔姆群岛时间
新西兰查塔姆群岛
UTC+13:00
TOT
汤加时间
汤加、萨摩亚
UTC+14:00
LINT
莱恩群岛时间
基里巴斯