Golang的夏令时

hai*_*ite 5 go dst

我一直在为调度界面设计一个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())
     }   
Run Code Online (Sandbox Code Playgroud)

我知道2015年10月25日凌晨2点在BST将导致时钟回到格林尼治标准时间凌晨1点(UTC).如果我将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
Run Code Online (Sandbox Code Playgroud)

但是,如果我在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版本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
Run Code Online (Sandbox Code Playgroud)

所以看起来像我在以后的版本中预期的那样工作......也发现了这个问题 夏令时和时区的最佳实践 所以将给它一个彻底的阅读.

谢谢.

pet*_*rSO 9

除了微软之外,其他所有人都使用IANA时区数据库,该数据库具有当前Go版本中包含的定期更新.

您使用了2012年3月发布的go1.0.3(发行历史).2015年的英国时区数据后来被添加.

始终使用当前版本的Go进行时区计算.

  • Go 使用 IANA 格式的数据,但(可能)在运行时找到的捆绑版本是在操作系统中尝试环境和标准位置后的最后选择。 (2认同)