2015-03-16 18 views
5

Ich habe eine UI für eine Planungsschnittstelle entworfen, wo ein Benutzer Timer eine Anzahl von Stunden in die Zukunft setzen kann. Ich möchte, wenn möglich, mit Sommerzeit umgehen können, ich dachte, es wäre ganz einfach. Beim Auschecken der Zeit. In den Golang-Paketen bin ich auf folgende Inkonsistenz gestoßen, wenn es das ist.Sommerzeit 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()) 
    } 

Ich weiß, dass 02.00 am 25. Oktober 2015 in BST werden sollte die Uhr dazu führen, 01.00 zurück zu gehen GMT (UTC). Wenn ich 1:59 Uhr BST um eine Minute inkrementiere, schaltet die Zeit tatsächlich auf GMT um.

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 

aber wenn ich eine Zeit nach 02.00 Uhr in BST analysieren würde ich erwarten, dass es nur so Erhöhen der Zeit, über den Übergang zu GMT wechseln würde. Falls der Übergangscode von der Add-Routine aufgerufen wurde, füge ich noch einmal eine Minute hinzu, aber die Zeit wird auch nicht auf GMT zurückgesetzt.

ich erwartet hätte eine der folgenden auftreten

a) für BST bleiben immer GMT + 1

b) zu jeder Zeit, wo BST „ungültig“ ist automatisch auf die richtige GMT zu ändern Zeit (ungültige BST ist zwischen 2 Uhr nach dem letzten Sonntag im Oktober und 2 Uhr nach dem letzten Sonntag im März des folgenden Jahres)

c) ein Fehler zu werfen, wenn ein Datum innerhalb dieser Daten mit BST (und vielleicht anderen erstellt wird Sommerzeit in anderen Ländern).

Sonst muss ich überprüfen, ob ein Benutzer ein Datum in BST eingibt, ob dieses Datum außerhalb von BST liegt, und Benutzer auf UTC-Zeiten einstellen oder zwingen, was das Ziel der Sommerzeitfunktion in der Bibliothek verhindert.

Während der Erforschung entdeckte ich dieses https://www.youtube.com/watch?v=-5wpm-gesOY und haben beschlossen, es auf jeden Fall nicht so einfach ist, wie ich auf den ersten ...

geschätzt würde

angenommen hatte sein Einsicht oder eine bessere Art und Weise Sommerzeiten zu handhaben.

go Mit Version 1.0.2 auf Debian Wheezy

Edited: erneut versucht gehen mit der Version 1.3.3 und bekam diese Ausgabe

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 

erscheint So wie ich in späteren Versionen erwartet zu arbeiten .. . Haben Sie diese Frage auch Daylight saving time and time zone best practices gefunden Also werde ich es gründlich lesen.

Danke.

+1

Verwenden Sie zunächst eine aktuelle Version (go1.4.2) von Go: [Erste Schritte] (http://golang.org/doc/install). – peterSO

+0

Ich würde sagen, eine neuere Version von Go ist die einzige Antwort, da Zeiten und Kalender im Allgemeinen ein ziemlich hartes Problem sind, und wir lieber Standard-Bibliotheksfunktionen verwenden sollten, als unsere eigenen zu schreiben. –

+0

Das heißt, es sei denn, Sie sind Jon Skeet. –

Antwort

9

Go, wie jeder andere außer Microsoft, verwendet die IANA Time Zone Database, die regelmäßige Updates enthält, die in der aktuellen Go-Version enthalten sind.

Sie verwendet go1.0.3, die im März 2012 veröffentlicht wurde (Release History). Die britischen Zeitzonendaten für 2015 wurden später hinzugefügt.

Verwenden Sie IMMER eine aktuelle Version von Go für Zeitzonenberechnungen.