【发布时间】:2015-05-19 00:06:11
【问题描述】:
我一直在为调度界面设计 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())
}
我知道英国夏令时 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,就像在过渡期间增加时间一样。如果添加例程调用了过渡代码,我会再次添加一分钟,但这也不会将时间恢复为 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 所以将给它一个彻底的阅读。
谢谢。
【问题讨论】:
-
首先,使用当前版本 (go1.4.2) 的 Go:Getting Started。
-
我会说使用更新版本的 Go 是唯一的答案,因为时间和日历通常是一个相当困难的问题,我们应该更喜欢使用标准库函数而不是编写我们自己的函数。
-
test.Sub( dur )不合法,您的意思可能是test.Add(-dur)。包含 Go 代码时,一个有效的 playground 链接很有帮助。 (旁注,使用dur := time.Minute或dur := 60 * time.Second等而不是time.ParseDuration与常量)。 -
你的权利。 test.Sub 调用在我的剪切和粘贴中不应该存在......谢谢
-
感谢大家刚刚检查了 go 1.3.3(也安装在我的系统上,但 debian 仍设置为默认使用 1.0.2) - 根据我的编辑。将尝试 1.4 并清除所有旧版本。再次感谢。