Я проектировал интерфейс пользователя для интерфейса планирования, где пользователь может установить таймеры на несколько часов в будущем. Я хочу, если возможно, иметь возможность управлять летним днем, я думал, что это будет довольно просто. Проверяя время. Время в пакетах golang я столкнулся с следующим несоответствием, если это то, что он есть.Переход на летнее время в 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())
}
Я знаю, что 2 утра на 25 октября 2015 года в BST будет должен вызвать часы, чтобы вернуться в 1am GMT (UTC). Если я увеличиваю 1:59 утра BST на одну минуту, время действительно переключится на 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
Однако, если я разобрать время после 2 часов ночи в BST я ожидал бы, чтобы перейти к GMT как увеличивающееся время в течение переходного периода будет иметь. В случае, если переходный код вызывается с помощью процедуры «Добавить», я добавляю минуту еще раз, но это также не возвращает время на GMT.
я ожидал бы один из следующих произойти
а) для BST, чтобы всегда оставаться GMT + 1
б) в любое время, когда BST является «недействительным» для автоматического изменения в правильном GMT (недействительный BST находится между 2 утра после последнего воскресенья в октябре и 2 часа ночи после последнего воскресенья марта следующего года)
c) ошибка, которая должна быть выброшена, если дата создана в эти даты с BST (и, возможно, другая летнее время в других странах).
В противном случае мне нужно будет проверить, вводит ли пользователь дату в BST, находится ли эта дата вне BST и настраивает или заставляет пользователей время UTC, какой тип побеждает объект, имеющий встроенные в библиотеку функции летнего времени.
Хотя исследования я это https://www.youtube.com/watch?v=-5wpm-gesOY заметил и решил, что это, безусловно, не так просто, как я в первый предположить ...
Любое понимание или лучший способ справиться с перехода на летнее время будут оценены.
Использование идти версии 1.0.2 на Debian свистящих
Отредактировано: повторен с использованием идти версии 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: [Начало работы] (http://golang.org/doc/install). – peterSO
Я бы сказал, что использование более новой версии Go является единственным ответом, поскольку времена и календари - довольно сложная проблема в целом, и мы должны предпочесть использовать стандартные библиотечные функции для написания собственных. –
То есть, если вы не Джон Скит. –