Go语言time.In()时区转换结果不符合预期的问题咨询
为什么把UTC 12:30转成Asia/Calcutta时区得到18:23,不是预期的18:00?
问题出在哪
你用time.Parse("15:04", "12:30")解析时间时,Go会自动把日期补成公元0001年1月1日。而这个年代的亚洲/加尔各答时区,还没使用现在统一的+5:30偏移,当时用的是基于本地经度的本地平太阳时,偏移是+05:53。12:30 UTC加上5小时53分钟,自然就得到18:23 IST了。
怎么解决
要拿到正确的现代时区转换结果,你得指定一个在现代时区规则生效范围内的日期,比如用最近的年份,或者直接构造带UTC时区的完整时间。
方法1:解析带日期和时区的完整时间串
改一下时间格式和输入,明确指定UTC时区:
const timeLayout string = "2006-01-02 15:04 UTC" t, err := time.Parse(timeLayout, "2024-01-01 12:30 UTC")
方法2:手动把日期改成现代年份
解析完时分后,把默认的远古日期替换成现代年份(比如2024),同时指定时区为UTC:
t, err := time.Parse(timeLayout, "12:30") if err != nil { // 错误处理 } // 替换日期为2024年1月1日,时区设为UTC t = time.Date(2024, time.January, 1, t.Hour(), t.Minute(), 0, 0, time.UTC)
修正后的完整代码
package main import ( "fmt" "os" "strconv" "time" ) const timeLayout string = "15:04" func main() { location, err := time.LoadLocation("Asia/Calcutta") if err != nil { fmt.Printf("无法加载时区: %v", err) os.Exit(1) } t, err := time.Parse(timeLayout, "12:30") if err != nil { fmt.Printf("无法解析时间: %v", err) os.Exit(1) } // 替换为现代日期并指定UTC时区 t = time.Date(2024, time.January, 1, t.Hour(), t.Minute(), 0, 0, time.UTC) timeAsPerTimeZone := t.In(location) fmt.Println(timeAsPerTimeZone.String()) timing := "Minutes: " + strconv.Itoa(timeAsPerTimeZone.Minute()) + " Hours: " + strconv.Itoa(timeAsPerTimeZone.Hour()) fmt.Println(timing) }
运行这段代码就能得到预期结果:2024-01-01 18:00:00 +0530 IST,以及Minutes: 0 Hours: 18。
内容的提问来源于stack exchange,提问作者Mohit Patil
相关产品推荐
相关产品推荐

