Ho progettato un'interfaccia utente per un'interfaccia di pianificazione, in cui un utente può impostare i timer un numero di ore nel futuro. Voglio essere in grado di gestire l'ora legale se possibile, ho pensato che sarebbe abbastanza semplice. Mentre sto facendo il check-out. Nei pacchetti golang mi sono imbattuto nella seguente incoerenza, se è quello che è.Ora legale in 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())
}
So che 02:00 il 25 ottobre 2015 in BST si dovrebbe causare il tempo per tornare a 01:00 GMT (UTC). Se incremento 1:59 am BST di un minuto, il tempo effettivamente passa a 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
Tuttavia, se mi parse un tempo dopo 2:00 in BST mi aspetterei che per passare al GMT proprio come incrementare il tempo durante la transizione avrebbe. Nel caso in cui il codice di transizione è stato chiamato dalla routine Aggiungi, aggiungo di nuovo un minuto, ma anche questo non riporta il tempo a GMT.
mi sarei aspettato una delle seguenti si verifichi
a) per BST di rimanere sempre GMT + 1
b) a qualsiasi momento dove BST è "valido" per cambiare automaticamente la corretta GMT orario (BST non valido tra le 2:00 dopo l'ultima domenica di ottobre e 2:00 dopo l'ultima domenica di marzo dell'anno successivo)
c) un errore da generare se viene creata una data entro tali date con BST (e forse altro ora legale in altri paesi).
Altrimenti dovrò verificare se un utente immette una data in BST se tale data si trova al di fuori di BST e regola o obbliga gli utenti alle ore UTC, che tipo di sconfigge l'oggetto di avere funzioni di ora legale incorporate nella libreria.
Mentre la ricerca ho notato questo https://www.youtube.com/watch?v=-5wpm-gesOY e hanno deciso che non è assolutamente così semplice come avevo ipotizzato in un primo momento ...
Tutta la comprensione o un modo migliore per gestire i tempi di risparmio di luce del giorno sarebbe apprezzato.
Utilizzando go versione 1.0.2 su Debian Wheezy
Modificato: ritentata usando go versione 1.3.3 e ottenuto questa uscita
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
Così sembra funzionare come mi aspettavo nelle versioni successive .. Abbiamo anche trovato questa domanda Daylight saving time and time zone best practices Così gli darò una lettura approfondita.
Grazie.
Innanzitutto, utilizzare una versione corrente (go1.4.2) di Go: [Guida introduttiva] (http://golang.org/doc/install). – peterSO
Direi che usare una versione più recente di Go è l'unica risposta, dal momento che tempi e calendari sono un problema piuttosto difficile in generale, e dovremmo preferire usare le funzioni di libreria standard per scrivere le nostre. –
Cioè, a meno che tu non sia Jon Skeet. –