go - 戈朗的夏令时

标签 go dst

我一直在为日程安排界面设计一个 UI,用户可以在其中设置 future 几个小时的计时器。如果可能的话,我希望能够处理夏令时,我认为这会很简单。在检查 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 version 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 所以将对其进行彻底阅读。

谢谢。

最佳答案

Go 与除 Microsoft 之外的其他所有人一样,使用 IANA Time Zone Database它有包含在当前 Go 版本中的定期更新。

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

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

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

相关文章:

r - 导入指定时区的日期时间,忽略夏令时

php - 在用户时区显示当前时间,不要忘记夏令时

go - 如何转换结构字段名称中的任何字符串,例如

mysql - 全选在 golaong gorm 中不起作用

Go:通过管道发送 gob 挂起 - 更新:进程外 http.ResponseWriter 正在阻塞

datetime - 夏令时和时区最佳实践

regex - 将特定的返回查询转换为 mgo

go - 我可以在 GO 中使用 transaction.Stmt(sqlstatement).Exec(parameter) 时记录最终查询吗?

quartz-scheduler - 如何处理 cron 触发器的 quartz 夏令时的用户时区?

javascript - Javascript Date.getHours() 是否包括夏令时?