Go工具集

全球时区转换

2025-03-28 22:51:32

原理讲解

在美国,夏令时从3月的第二个星期日开始,到11月的第一个星期日结束,并在当地时间凌晨2点更改时间。 春天开始施行夏令时时,在当天的凌晨2点人们要把时钟拨到3点,在秋天结束夏令时时,时钟要从凌晨2点拨到1点。 每年的夏令时时间总共持续34周(238天),约占全年的65%。

  • 时区划分:全球共分为 24 个时区,以本初子午线(0° 经线)为基准,向东、向西各划分 12 个时区。每个时区相差 1 小时,东边的时区时间比西边的早。
  • 计算时差:北京时间与圣何塞所在的太平洋时间相差的时区数为8−(−8)=16个时区,所以时差为 16 小时。当北京时间是上午 8 点时,圣何塞时间是前一天的下午 4 点。
  • 进行时区转换时,要先确定两个地区所在的时区,计算出时区差,再根据 “东加西减” 的原则进行计算。如果涉及夏令时,还要根据具体情况进行调整。
时区原理图

时区调整时,物理机的Location会改变,时区由UTC+2变为UTC+1。所以海外部署服务时间处理都需要携带时区信息,使用RFC3339这种格式来操作,或者Location都设为UTC0来服务。

Go实现

in, err := time.ParseInLocation(time.DateTime, input, cst)
in.In(loc).Format(time.DateTime)
Web Analytics Made Easy - Statcounter