Golang 的夏令时

我一直在为调度界面设计一个 UI,用户可以在其中设置未来几个小时的计时器。如果可能的话,我希望能够处理夏令时,我认为这很简单。在检查 golang 包中的 time.Time 时,我遇到了以下不一致情况,如果是这样的话。


package main


import (

   "fmt"

   "time"

)


    func main(){

        const timeFormat = "2 Jan, 2006 3:04pm (MST)"

        test , err := time.Parse( timeFormat, "25 Oct, 2015 1:59am (BST)" )

        fmt.Println( test , test.UTC() , err)

        dur , _ := time.ParseDuration( "1m" )

        test = test.Add( dur )

        fmt.Println( test , test.UTC())


        fmt.Println( "--------------------"  )


        test , err = time.Parse( timeFormat, "25 Oct, 2015 2:01am (BST)" )

        fmt.Println( test , test.UTC() , err)

        test = test.Add( dur )

        fmt.Println( test , test.UTC())


        test = test.Sub( dur )

        fmt.Println( test , test.UTC())

     }   

我知道 BST 2015 年 10 月 25 日凌晨 2 点应该会导致时钟回到格林威治标准时间 (UTC) 凌晨 1 点。如果我将 BST 凌晨 1:59 增加一分钟,时间确实会切换到 GMT。


2015-10-25 01:59:00 +0100 BST 2015-10-25 00:59:00 +0000 UTC <nil>

2015-10-25 01:00:00 +0000 GMT 2015-10-25 01:00:00 +0000 UTC

--------------------

2015-10-25 02:01:00 +0000 BST 2015-10-25 02:01:00 +0000 UTC <nil>

2015-10-25 02:02:00 +0000 BST 2015-10-25 02:02:00 +0000 UTC

但是,如果我在 BST 凌晨 2 点之后解析时间,我希望它切换到 GMT,就像在过渡期间增加时间一样。如果 Add 例程调用了过渡代码,我会再次添加一分钟,但这也不会将时间恢复为 GMT。


我原以为会发生以下情况之一


a) 让 BST 始终保持 GMT+1


b) 到 BST“无效”的任何时间自动更改为正确的 GMT 时间(无效 BST 在 10 月最后一个星期日之后的凌晨 2 点和次年 3 月最后一个星期日之后的凌晨 2 点之间)


c) 如果在这些日期内使用 BST(可能还有其他国家/地区的其他夏令时)创建日期,则会引发错误。


否则,我将不得不检查用户是否在 BST 中输入了一个日期,该日期是否在 BST 之外,并调整或强制用户使用 UTC 时间,这违背了在库中内置夏令时功能的目标。


在研究时,我发现了这个https://www.youtube.com/watch?v=-5wpm-gesOY 并决定它绝对不像我最初假设的那么简单......


任何见解或处理夏令时的更好方法将不胜感激。


在 Debian Wheezy 上使用 go 1.0.2 版


编辑:使用 go version 1.3.3 重试并得到这个输出


2015-10-25 01:59:00 +0100 BST 2015-10-25 00:59:00 +0000 UTC <nil>

2015-10-25 01:00:00 +0000 GMT 2015-10-25 01:00:00 +0000 UTC

--------------------

2015-10-25 01:00:00 +0000 GMT 2015-10-25 01:00:00 +0000 UTC <nil>

2015-10-25 01:01:00 +0000 GMT 2015-10-25 01:01:00 +0000 UTC

所以似乎在以后的版本中按我的预期工作......也发现了这个问题 夏令时和时区最佳实践 所以将彻底阅读它。


元芳怎么了
浏览 296回答 1
1回答

慕无忌1623718

Go 与除 Microsoft 之外的其他所有人一样,使用IANA 时区数据库,该数据库具有包含在当前 Go 版本中的定期更新。您使用了 2012 年 3 月发布的 go1.0.3(发布历史)。2015 年的英国时区数据是后来添加的。始终使用当前版本的 Go 进行时区计算。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go