我一直在设计用于调度界面的UI,在该界面中,用户可以在 future 数小时内设置计时器。我希望能够在可能的情况下处理夏时制,我认为这将非常简单。在检查time.golang包中的时间时,我遇到了以下不一致之处(如果确实如此)。

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())
     }

我知道2015年10月25日凌晨2点(BST)将使时钟回到格林尼治标准时间(UTC)凌晨1点。如果我将BST的凌晨1:59增加一分钟,则时间的确会切换为格林尼治标准时间。
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版本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

因此似乎可以按预期在以后的版本中工作...
还发现了这个问题
Daylight saving time and time zone best practices
因此,将对其进行详尽的阅读。

谢谢。

最佳答案

和Microsoft以外的其他所有人一样,Go都使用IANA Time Zone Database,它具有当前Go发行版中包含的定期更新。

您使用了2012年3月发布的go1.0.3(Release History)。随后添加了2015年英国时区数据。

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

关于go - 夜郎市的夏时制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29084228/

10-15 20:30