我一直在為調度界面設計一個 UI,用戶可以在其中設置未來幾個小時的計時器。如果可能的話,我希望能夠處理夏令時,我認為這很簡單。在檢查 golang 包中的 time.Time 時,我遇到了以下不一致情況,如果是這樣的話。package mainimport ( "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+1b) 到 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 version 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所以似乎在以后的版本中按我的預期工作......也發現了這個問題 夏令時和時區最佳實踐 所以將徹底閱讀它。
1 回答
慕無忌1623718
TA貢獻1744條經驗 獲得超4個贊
Go 與除 Microsoft 之外的其他所有人一樣,使用IANA 時區數據庫,該數據庫具有包含在當前 Go 版本中的定期更新。
您使用了 2012 年 3 月發布的 go1.0.3(發布歷史)。2015 年的英國時區數據是后來添加的。
始終使用當前版本的 Go 進行時區計算。
- 1 回答
- 0 關注
- 337 瀏覽
添加回答
舉報
0/150
提交
取消
