我一直在为调度界面设计一个用户界面,用户可以在未来的几个小时内设置计时器。如果可能的话,我希望能够处理夏令时,我认为这很简单。在检查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())
}
我知道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
然而,如果我在BST凌晨2点之后解析一段时间,我会期望它转换为GMT,就像增加过渡时间一样。如果过渡代码被Add例程调用,我再添加一分钟,但这也不会将时间恢复为GMT。
我原本期望发生下列情况之一
a)BST始终保持GMT + 1
b)BST无效的任何时间&#34;自动更改为正确的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 所以将全面阅读。
感谢。
答案 0 :(得分:9)
像其他人一样去微软,使用IANA Time Zone Database,它包含当前Go版本中包含的定期更新。
您使用的是2012年3月发布的go1.0.3(Release History)。 2015年的英国时区数据后来被添加。
始终使用当前版本的Go进行时区计算。