2016-08-05 53 views
2

Ich habe dieses Datum, oder etwas, das so aussieht.Convert UTC-String zu Golang-Zeit-Objekt

2014-11-17 23:02:03 +0000 UTC 

Ich möchte dieses Objekt zu einer Zeit, konvertieren, und ich habe es nicht gelungen, eine Ausgabe von time.Parse abgesehen von produzieren:

0001-01-01 00:00:00 +0000 UTC 

Ich habe dieses Layout versucht:

time.RFC3339 
0001-01-01 00:00:00 0000 UTC 
2016-10-10 
time.UnixDate 

Und ein paar mehr - keiner hat funktioniert. Diese

ist, wie ich rufe parse:

updatedAt, err := time.Parse(time.UnixDate, updatedAtVar) 

Wie erstelle ich eine Zeit Objekt aus einem String?

Antwort

4

Höchstwahrscheinlich haben Sie ein falsches Layout verwendet, und Sie haben den zurückgegebenen Fehler nicht überprüft.

Das Layout muss dieses Datum/Uhrzeit im Format Ihrer Eingabezeit ist:

Mon Jan 2 15:04:05 -0700 MST 2006 

diesen Arbeitscode Siehe:

layout := "2006-01-02 15:04:05 -0700 MST" 
t, err := time.Parse(layout, "2014-11-17 23:02:03 +0000 UTC") 
fmt.Println(t, err) 

Output (versuchen Sie es auf den Go Playground):

2014-11-17 23:02:03 +0000 UTC <nil> 

EDIT:

In Ihrer Frage enthalten Sie ein + Zeichen in Ihrer Eingabe Zeit (als Teil der Zone Offset), aber Sie haben Fehler mit Zeiten anderer Formate.

Time.String() verwendet das folgende Format string:

"2006-01-02 15:04:05.999999999 -0700 MST" 

Also entweder diese verwenden, um die Zeit zu analysieren, oder Time.Format() verwenden Ihre Stringdarstellungen zu erzeugen, in dem Sie das Layout festlegen können, so dass Sie das gleiche Layout verwenden können parse die Zeitzeichenfolgen.

2. Runde:

Sie mit Ihrer Zeit Strings in URLs. Das Zeichen + ist ein Sonderzeichen in der URL-Codierung: Es bezeichnet den Speicherplatz. So wird die + wird in den Raum konvertiert (und so verschwindet es aus Ihrer Zeit Zeichenfolge). Verwenden Sie die richtige URL-Codierung! Überprüfen Sie das net/url Paket und this example.

+0

lol..yes. Ich habe das falsche Layout verwendet. Ich habe keine Ahnung, welches Layout zu verwenden ist. Ich habe gerade versucht "" 2006-01-02 15:04:05 -0700 MST "und es hat auch nicht funktioniert. Fragen, ob jemand wusste, welches Layout zu verwenden, weil dies ein allgemeines Format ist. Ich gehe buchstäblich 'time.Now()', wandelt es in String um und übergebe es zum Entpacken (schreibt einen Integrationstest) – praks5432

+0

@ praks5432 Was meinst du? Es funktioniert nicht für dich? Klicken Sie auf den Playground-Link in meiner Antwort und probieren Sie es selbst aus. – icza

+0

Ich fügte '2014-11-17 23:02:03 0000 UTC' ein, was die Ausgabe von' time.Now() ist. String() '(Ich fror Zeit - für einen Test) Ich bekomme diesen Fehler in Ihr Spielplatz '0001-01-01 00:00:00 +0000 UTC Parsing Zeit" 2014-11-17 23:02:03 0000 UTC "als" 2006-01-02 15:04:05 -0700 MST ": kann nicht parse "UTC" als "-0700" ' – praks5432

0

Sie verwenden wahrscheinlich das falsche Layout. Wie in time.Parse erläutert, müssen Sie ein Layout angeben, das Go hilft zu verstehen, wie das Datum, das als Eingabe übergeben wurde, formatiert ist.

Es gibt vordefinierte Layouts (wie die, die Sie verwendet haben), aber keine entspricht Ihrer Eingabe. Daher müssen Sie ein benutzerdefiniertes Layout definieren.

Ein Layout verwendet folgendes Datum als Referenz:

Mon Jan 2 15:04:05 MST 2006 

Das Layout ist nichts anderes, dass eine Darstellung zu diesem Zeitpunkt, dass die Darstellung Ihrer Eingabe übereinstimmt:

t, err := time.Parse("2006-01-02 15:04:05 -0700 MST", "2014-11-17 23:02:03 +0000 UTC") 

Denken Sie auch daran zu Überprüfen Sie err auf Fehler. Es ist wahrscheinlich, dass Ihre Versuche einen Fehler zurückgegeben haben, aber Sie haben es nicht überprüft.

package main 

import (
    "fmt" 
    "log" 
    "time" 
) 

func main() { 
    t, err := time.Parse("2006-01-02 15:04:05 -0700 UTC", "2014-11-17 23:02:03 +0000 UTC") 
    if err != nil { 
     log.Fatalln(err) 
    } 
    fmt.Println(t) 
} 
+0

Ja, ich verstehe. Aber was ich tue, ist 'time.Now(). String' als URL-Parameter. Ich entpacke dann diesen Parameter und versuche, in eine Zeit zurück zu konvertieren (dies ist ein Test, den ich schreibe). Die Ausgabe, die ich von 'time.Now(). String 'bekomme, sobald sie entpackt ist, ist 2014-11-17 23:02:03 0000 UTC', die nicht geparst wird. Ich weiß, dass ich das falsche Layout habe. Ich versuche zu finden, welches Layout. – praks5432