2015-03-16 6 views
5

Я проектировал интерфейс пользователя для интерфейса планирования, где пользователь может установить таймеры на несколько часов в будущем. Я хочу, если возможно, иметь возможность управлять летним днем, я думал, что это будет довольно просто. Проверяя время. Время в пакетах 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 Так что он будет внимательно читать.

Спасибо.

+1

Сначала используйте текущую версию (go1.4.2) Go: [Начало работы] (http://golang.org/doc/install). – peterSO

+0

Я бы сказал, что использование более новой версии Go является единственным ответом, поскольку времена и календари - довольно сложная проблема в целом, и мы должны предпочесть использовать стандартные библиотечные функции для написания собственных. –

+0

То есть, если вы не Джон Скит. –

ответ

9

Go, как и все остальные, но Microsoft, использует IANA Time Zone Database, который имеет регулярные обновления, которые включены в текущую версию Go.

Вы использовали go1.0.3, который был выпущен в марте 2012 года (Release History). Данные британского часового пояса на 2015 год были добавлены позднее.

ВСЕГДА использует текущую версию Go для расчета часового пояса.

Смежные вопросы