Go语言对夏令时的处理

经验分享
1927 0

做项目的时候发现:有些人的生日日期字符串格式化之后时区变了,这令人很费解。于是上网查了很多资料,才知道Go有针对国内的夏令时做一些单独的处理。

夏令时

夏令时,表示为了节约能源,人为规定时间的意思。也叫夏时制,夏令时(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。
1986年4月,国内有关部门发出“在全国范围内实行夏时制的通知”,具体做法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行。

详见夏令时-百度百科

具体表现

time_test.go

package main

import (
    "fmt"
    "testing"
    "time"
)

func TestTime(t *testing.T) {
    t1 := time.Date(1987, 7, 12, 13, 0, 0, 0, time.Local)
    fmt.Println("本地时间 1987:7:12 13:00:00 时间为", t1, " 发现时间往后推了一个时区")
    t3 := time.Date(1987, 10, 12, 13, 0, 0, 0, time.Local)
    fmt.Println("本地时间 1987:10:12 13:00:00 时间为", t3, " 同年10月份的时间显示正常")
    t4 := time.Date(2021, 7, 12, 13, 0, 0, 0, time.Local)
    fmt.Println("本地时间 2021:7:12 13:00:00 时间为", t4, "今年,时间显示也正常")

    local, _ := time.LoadLocation("Asia/Shanghai")
    t11, _ := time.ParseInLocation("2006:01:02 15:04:05", t1.Format("2006:01:02 15:04:05"), local)
    fmt.Println("将显示不正常的时间转化为北京时区 ", t11, "时间依旧往后推了一个时区")
    fmt.Println("将时间按照0时区显示 ", t1.UTC(), "时间显示正常")

    localFix := time.FixedZone("CST", 8*3600)
    t12 := t1.In(localFix)
    fmt.Println("将本地时区修正一下", t12, " 时间显示正常")

}

输出结果:

=== RUN   TestTime
本地时间 1987:7:12 13:00:00 时间为 1987-07-12 13:00:00 +0900 CDT  发现时间往后推了一个时区
本地时间 1987:10:12 13:00:00 时间为 1987-10-12 13:00:00 +0800 CST  同年10月份的时间显示正常
本地时间 2021:7:12 13:00:00 时间为 2021-07-12 13:00:00 +0800 CST 今年,时间显示也正常
将显示不正常的时间转化为北京时区  1987-07-12 13:00:00 +0900 CDT 时间依旧往后推了一个时区
将时间按照0时区显示  1987-07-12 04:00:00 +0000 UTC 时间显示正常
将本地时区修正一下 1987-07-12 12:00:00 +0800 CST  时间显示正常
--- PASS: TestTime (0.00s)

修正时区

如果对项目没有特殊要求,可以直接对时区进行修正

localFix := time.FixedZone("CST", 8*3600)
t12 := t1.In(localFix)
fmt.Println("将本地时区修正一下", t12, " 时间显示正常")
最后更新 2021-10-25
评论 ( 0 )
OωO
隐私评论