So analysieren Sie den Unix-Zeitstempel auf time.Time

126

Ich versuche, einen Unix- Zeitstempel zu analysieren , erhalte jedoch einen Fehler außerhalb des Bereichs. Das macht für mich keinen Sinn, weil das Layout korrekt ist (wie in den Go-Dokumenten):

package main

import "fmt"
import "time"

func main() {
    tm, err := time.Parse("1136239445", "1405544146")
    if err != nil{
        panic(err)
    }

    fmt.Println(tm)
}

Spielplatz

Hallo
quelle

Antworten:

239

Die time.ParseFunktion führt keine Unix-Zeitstempel aus. Stattdessen können Sie strconv.ParseIntdie Zeichenfolge analysieren int64und den Zeitstempel erstellen mit time.Unix:

package main

import (
    "fmt"
    "time"
    "strconv"
)

func main() {
    i, err := strconv.ParseInt("1405544146", 10, 64)
    if err != nil {
        panic(err)
    }
    tm := time.Unix(i, 0)
    fmt.Println(tm)
}

Ausgabe:

2014-07-16 20:55:46 +0000 UTC

Spielplatz: http://play.golang.org/p/v_j6UIro7a

Bearbeiten:

Geändert von strconv.Atoizu strconv.ParseInt, um int-Überläufe auf 32-Bit-Systemen zu vermeiden.

ANisus
quelle
1
Irgendeine Idee, warum es in den Dokumenten keinen solchen Verweis gibt? Sie geben sogar das Unix-Timestap-Layout als Layoutbeispiel an.
Hey
Ich denke, das liegt daran, dass ein Unix-Zeitstempel keine Analyse erfordert, da es sich nicht um eine Textdarstellung handelt, sondern um eine ganzzahlige Darstellung der Zeit. Sie hatten gerade eine Zeichenfolgendarstellung eines ganzzahligen Werts. Und die Erwähnung von 1136239445 in den Dokumenten dient wahrscheinlich nur der Klarstellung, welcher genaue Zeitstempel als Referenzzeit verwendet werden soll, nicht, dass er als Layout verwendet werden soll.
ANisus
4
Wäre es nicht besser, strconv.ParseUintstattdessen zu verwenden, da negative Zahlen sowieso keinen Sinn ergeben?
Atmocreations
6
@Atmocreations: func Unix(sec int64, nsec int64) Timeempfängt int64Werte. Auch negative Zahlen für Sek. Sind absolut sinnvoll - sie beschreiben Daten vor 1970! :) nsecNegative Werte bedeuten, dass so viele Nanosekunden aus den Sekunden entfernt werden.
ANisus
1
Ich möchte nur das Datum und die Uhrzeit als "2014-07-16 20:55:46" wie könnte es erreicht werden?
Karthik
14

Sie können time.Unix direkt verwenden, um den Unix-Zeitstempel in UTC umzuwandeln

package main

import (
  "fmt"
  "time"
)


func main() {
    unixTimeUTC:=time.Unix(1405544146, 0) //gives unix time stamp in utc 

    unitTimeInRFC3339 :=unixTimeUTC.Format(time.RFC3339) // converts utc time to RFC3339 format

    fmt.Println("unix time stamp in UTC :--->",unixTimeUTC)
    fmt.Println("unix time stamp in unitTimeInRFC3339 format :->",unitTimeInRFC3339)
}

Ausgabe

unix time stamp in UTC :---> 2014-07-16 20:55:46 +0000 UTC
unix time stamp in unitTimeInRFC3339 format :----> 2014-07-16T20:55:46Z

Checken Sie in Go Playground ein: https://play.golang.org/p/5FtRdnkxAd

Negi Yogi
quelle
4

Teilen einiger Funktionen, die ich für Daten erstellt habe:

Bitte beachten Sie, dass ich Zeit für einen bestimmten Ort haben wollte (nicht nur UTC-Zeit). Wenn Sie UTC-Zeit wünschen, entfernen Sie einfach die loc-Variable und den Funktionsaufruf .In (loc).

func GetTimeStamp() string {
     loc, _ := time.LoadLocation("America/Los_Angeles")
     t := time.Now().In(loc)
     return t.Format("20060102150405")
}
func GetTodaysDate() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("2006-01-02")
}

func GetTodaysDateTime() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("2006-01-02 15:04:05")
}

func GetTodaysDateTimeFormatted() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("Jan 2, 2006 at 3:04 PM")
}

func GetTimeStampFromDate(dtformat string) string {
    form := "Jan 2, 2006 at 3:04 PM"
    t2, _ := time.Parse(form, dtformat)
    return t2.Format("20060102150405")
}
Adi
quelle
Das Entfernen .In(loc)gab mir Zeit in -0400 EDT. Das Ersetzen durch .In(time.UTC)gab mir Zeit in UTC.
NatoBoram
3

Laut der go-Dokumentation gibt Unix eine Ortszeit zurück.

Unix gibt die lokale Zeit zurück, die der angegebenen Unix-Zeit entspricht

Dies bedeutet, dass die Ausgabe von der Maschine abhängt, auf der Ihr Code ausgeführt wird. Dies ist meistens das, was Sie benötigen. Manchmal möchten Sie jedoch möglicherweise den Wert in UTC haben.

Zu diesem Zweck habe ich das Snippet so angepasst , dass es eine Zeit in UTC zurückgibt:

i, err := strconv.ParseInt("1405544146", 10, 64)
if err != nil {
    panic(err)
}
tm := time.Unix(i, 0)
fmt.Println(tm.UTC())

Dies wird auf meinem Computer gedruckt (in MESZ)

2014-07-16 20:55:46 +0000 UTC
Thib-o
quelle
0

Ich protokolliere viel, wo die Zeitstempel float64 sind, und verwende diese Funktion, um die Zeitstempel als Zeichenfolge abzurufen:

func dateFormat(layout string, d float64) string{
    intTime := int64(d)
    t := time.Unix(intTime, 0)
    if layout == "" {
        layout = "2006-01-02 15:04:05"
    }
    return t.Format(layout)
}
Saxasmu
quelle
-6

Verwenden Sie einfach time.Parse

Beispiel:

package main

import (
    "fmt"
    "time"
)

func main() {
    fromString := "Wed, 6 Sep 2017 10:43:01 +0300"
    t, e := time.Parse("Mon, _2 Jan 2006 15:04:05 -0700", fromString)
    if e != nil {
        fmt.Printf("err: %s\n", e)
    }
    fmt.Printf("UTC time: %v\n", t.UTC())
}

Arbeitsbeispiel auf play.golang.org .

okhrypko
quelle
2
Die Frage gibt einen Unix-Zeitstempel an. Diese Antwort spricht diesen Aspekt nicht an.
t3h2mas