2015-09-15 21 views
6

Rozważmy następujący przykład:Dlaczego nie można przeanalizować czasu reprezentowanego przez dostarczone formaty?

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    fmt.Println(time.Parse(time.RFC3339, time.RFC3339)) 
} 

wyjście jest:

0001-01-01 00:00:00 +0000 UTC parsing time "2006-01-02T15:04:05Z07:00": extra text: 07:00 

Dlaczego nie time.Parse() obsłużyć układ jako wartość? Czego tu brakuje?


UPDATE: Odcięcie wartość strefy czasowej (ale nie 'Z' ograniczającej czas od strefy) rozwiązuje go:

fmt.Println(time.Parse(time.RFC3339, "2015-09-15T11:50:00Z")) 

Dlaczego nie time.Parse() obsługiwać informacje o strefie czasowej podczas używania time.RFC3339 jako ciągu układu?

http://play.golang.org/p/p3fHfJNHVK


UPDATE: odpowiedź JimB doprowadziły mnie do zapoznania się z RFC3339 i znalazłem te przykłady, które wyjaśniają dalej:

Oto kilka przykładów z datą Internet/format czasu.

1985-04-12T23:20:50.52Z

Stanowi to 20 minut i 50.52 sekund po 23 godzinie 12 kwietnia 1985 roku w UTC.

1996-12-19T16:39:57-08:00

Stanowi to 39 minuty i 57 sekund po 16 godzinie 19 grudnia 1996 roku z przesunięciem -08: 00 z UTC (Pacific Standardowy czas). Zauważ, że jest to odpowiednik 1996-12-20T00:39:57Z w UTC.

+1

Czy to pomocne? https://github.com/golang/go/issues/9346 –

+0

Tak, to było pomocne. Dzięki! – mdwhatcott

Odpowiedz

10

Format time.RFC3339 to przypadek, w którym sam ciąg formatu nie jest prawidłowym czasem. Nie można mieć przesunięcia w ciągu czasowym, ale ciąg formatu ma oba parametry, ponieważ specyfikacja może zawierać specyfikację określonego typu strefy czasowej.

Oba są ważne czasy RFC3339:

"2015-09-15T14:00:12-00:00" 
"2015-09-15T14:00:13Z" 

i pakiet czas musi być w stanie przetworzyć je zarówno przy użyciu tego samego formatu RFC3339 ciąg.