2016-04-10 22 views
1
funktioniert

Ich weiß, dass am 26. Oktober 2014 02.00 Uhr sollte die Uhr rückwärts 1 Stunde gehen, aber ich kann dies ein einfaches golang Programmgolang Zeitzone Sommerzeit nicht

const timeFormat = "2 Jan, 2006 3:04pm" 

loc, err := time.LoadLocation("Europe/Moscow") 
log.Print(loc, err) 

testz , _ := time.ParseInLocation(timeFormat, "26 Oct, 2014 01:59am", loc) 
fmt.Println(testz , testz.UTC()) 
testz = testz.Add(time.Minute) 
fmt.Println(testz , testz.UTC()) 
testz = testz.Add(time.Minute) 
fmt.Println(testz , testz.UTC()) 

nicht reproduzieren Ausgänge

2014-10-26 01:59:00 +0300 MSK 2014-10-25 22:59:00 +0000 UTC 
2014-10-26 02:00:00 +0300 MSK 2014-10-25 23:00:00 +0000 UTC 
2014-10-26 02:01:00 +0300 MSK 2014-10-25 23:01:00 +0000 UTC 

gehen 1.6, linux

Antwort

2

Ihr Ausgang gegeben, es sieht aus wie dieser Zeile:

testz , _ := time.ParseInLocation(timeFormat, "26 Oct, 2014 01:59am", loc) 

... eigentlich Sie die später gegeben geben der beiden Vorkommen von 1.59, dass es sich um eine von + Offset ist zeigt 3. Mit anderen Worten, Sie sehen sich eine Stunde später drei Minuten Zeit an, als Sie sein möchten - fast eine Stunde nach dem Sommerwechsel.

können Sie Ihren Code ändern, um mit einem eindeutigen Wert wie folgt zu starten:

testz, _ := time.ParseInLocation(timeFormat, "26 Oct, 2014 00:59am", loc) 
testz = testz.Add(time.Hour) 

Ich würde erwarten, dass dann

zeigen
2014-10-26 01:59:00 +0400 MSK 2014-10-25 21:59:00 +0000 UTC 
2014-10-26 01:00:00 +0300 MSK 2014-10-25 22:00:00 +0000 UTC 
2014-10-26 01:01:00 +0300 MSK 2014-10-25 22:01:00 +0000 UTC 

(ich habe nicht versucht, wie ich Go nicht installiert - aber ich würde erwarten, dass es funktioniert.)

+0

Nur überprüft, zeigt es 0:59, 1:00, 1:01 aber in +0400 MSK Zeitzone ... Und ich verstehe es nicht ... Diesmal ('2014-10-26 02:00:00 +0300 MSK 2014-10-25 23:00:00 +0000 UTC ') und jede weitere innerhalb dieser Stunde ab der ersten Ausgabe ist technisch überhaupt nicht möglich, da Uhren verschoben wurden und diese Stunde übersprungen werden sollte – let4be

+0

@ let4be: Are Bist du sicher, dass du den 'Add (time.Hour)' Teil beigefügt hast? Es hört sich so an. Vergiss nicht, dass die Stunde nicht übersprungen wird - es wird * wiederholt *. Ich denke, Sie haben sich vielleicht über die Art der Veränderung verwirrt, die das ist. –

+0

@ let4be: Ich installiere Go jetzt, damit ich es selbst ausprobieren kann :) –

-2

Es ist nicht, weil Ihr Code Fehler hat, für nur time.UTC() UTC-Zeit gedruckt werden, dass Zeitzone 0 Zeit ist, und aus dem Code time.LoadLocation("Europe/Moscow") können wir vielleicht wissen, dass Sie in Moskau sind, die zu Ost Timezone 3 gehört, so wird die Zeit früher als UTC Zeit um drei Stunden sein, was bedeutet, dass < Ihre Zeit> = < UTC Zeit> +3.

+0

richtig, aber ich spreche über _daylight_ Sparzeiten, und das ist _additional_ +/- 1 Stunden Verschiebung zusätzlich zur Zeitzone. 26 Oct, 2014 02:00 Uhr war das letzte Mal, dass wir diese Zeitschicht hatten, Golang scheint davon nichts zu wissen ... Andere Zeitverschiebungen in Bezug auf die Sommerzeit scheinen in der Zeitzone Europa/Moskau zu funktionieren, einfach nicht spezifisches Datum/Uhrzeit – let4be

+1

Das OP druckt sowohl 'testz' als auch' testz.UTC() '. Sehen Sie sich die Ausgabe an - jede Zeile enthält die Ortszeit * und * die UTC-Zeit. Der OP ist (verständlicherweise) alarmiert, dass sich der UTC-Offset nicht ändert, wenn er es erwartet - was in meiner Antwort erklärt wird. –

Verwandte Themen