Erhalten eines Unix-Zeitstempels in Go-Sprache (aktuelle Zeit in Sekunden seit der Epoche)


84

Ich habe einen Code in Go geschrieben, den ich aktualisieren möchte, um mit den neuesten wöchentlichen Builds zu arbeiten. (Es wurde zuletzt unter r60 gebaut). Bis auf das folgende Bit funktioniert jetzt alles:

 if t, _, err := os.Time(); err == nil {
   port[5] = int32(t)
 }

Irgendwelche Ratschläge, wie Sie dies aktualisieren können, um mit der aktuellen Go-Implementierung zu arbeiten?

Antworten:


165
import "time"
...
port[5] = int32(time.Now().Unix())

40
ALERT: Der Unix()Rückgabewert ist vom Typ int64. Das Abschneiden des Typwerts int64auf Typ int32ist ein Beispiel für das Problem des Jahres 2038 .
PeterSO

1
go1.9.2 darwin / amd64 dies gibt konsistent zurück: 1969-12-31 19:00:00, was ungefähr entspricht: time.Unix (0, 0). Dies ist ohne Kürzung.
Breedly

31

Wenn Sie es möchten, stringkonvertieren Sie es einfach über strconv:

package main

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

func main() {
    timestamp := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
    fmt.Println(timestamp) // prints: 1436773875771421417
}

Was ist der Sinn davon? Wenn jemand eine Zahl in eine Zeichenfolge konvertieren möchte, kann er herausfinden, wie das geht. Oder sollte ich einfach eine andere Antwort hinzufügen: Wenn Sie es in ein Bytearray konvertieren möchten, machen Sie einfach [] Byte (...)?
Salvador Dali

11
@SalvadorDali Eigentlich ist das genau das, was ich brauchte. Fügen Sie Ihre Antwort hinzu, um sie in ein Byte-Array zu konvertieren, wenn Sie möchten. Ich bin sicher, dass irgendwann jemand vorbeikommt und den Code benötigt.
anon58192932

3
time.Now (). UTC (). UnixNano () kann durch time.Now () ersetzt werden. UnixNano () - Das Dokument gibt an, dass das Ergebnis nicht von der mit t verknüpften Position abhängt.
Abu Junayd

16

Ein weiterer Tipp. time.Now().UnixNano()(godoc) gibt Ihnen Nanosekunden seit der Epoche. Es ist keine reine Unix-Zeit, aber es gibt Ihnen Präzision von weniger als einer Sekunde in derselben Epoche, was praktisch sein kann.

Bearbeiten: Geändert, um der aktuellen Golang-API zu entsprechen


1
Ich weiß, dass ich einen alten Thread wiederbelebe, aber ich frage mich ... Python dokumentiert klar die Probleme, die es hat, eine genaue Zeit auf verschiedenen Plattformen zu erhalten. Siehe docs.python.org/2/library/time.html und suchen Sie nach "Präzision". Der Punkt ist: Nicht weil Sie einen float64 haben, sind alle Dezimalstellen signifikant. Wie wird Go's Zeit umgesetzt, wie sehr kann ich dieser Nanosekundengenauigkeit vertrauen?
Niriel

5
Das funktioniert hier nicht, aber time.Now().UnixNano()( Referenz ).
Jo Liss

0

Aufbauend auf der Idee einer anderen Antwort hier, um eine für Menschen lesbare Interpretation zu erhalten, können Sie Folgendes verwenden:

package main

import (
    "fmt"
    "time"
)

func main() {
    timestamp := time.Unix(time.Now().Unix(), 0)
    fmt.Printf("%v", timestamp) // prints: 2009-11-10 23:00:00 +0000 UTC
}

Probieren Sie es auf dem Go-Spielplatz aus .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.