Ottenere un timestamp Unix in Go Language (tempo corrente in secondi dall'epoca)


88

Ho del codice scritto in Go che sto cercando di aggiornare per funzionare con le ultime build settimanali. (È stato costruito l'ultima volta con r60). Ora funziona tutto tranne il bit seguente:

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

Qualche consiglio su come aggiornarlo per lavorare con l'attuale implementazione di Go?

Risposte:


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

44
AVVISO: il Unix()valore restituito è di tipo int64. Il troncamento del int64valore del tipo per digitare int32è un esempio del problema dell'anno 2038 .
peterSO

1
go1.9.2 darwin / amd64 restituisce costantemente: 1969-12-31 19:00:00, che è più o meno equivalente a: time.Unix (0, 0). Questo è senza troncamento.
Breedly

31

Se lo desideri, stringbasta convertirlo tramite strconv:

package main

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

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

Qual è il punto di questo? Se qualcuno vuole convertire un numero in una stringa, può scoprire come farlo. O forse dovrei aggiungere solo un'altra risposta: se vuoi convertirlo in un bytearray, basta fare [] byte (...)?
Salvador Dali,

12
@SalvadorDali In realtà questo è esattamente ciò di cui avevo bisogno. Vai avanti e aggiungi la tua risposta per convertirla in un array di byte se vuoi sono sicuro che qualcuno arriverà alla fine e avrà bisogno del codice.
anon58192932

3
time.Now (). UTC (). UnixNano () può essere sostituito con time.Now (). UnixNano () - il documento dice che il risultato non dipende dalla posizione associata a t.
Abu Junayd

16

Un altro suggerimento. time.Now().UnixNano()(godoc) ti darà nanosecondi dall'epoca. Non è strettamente tempo Unix, ma ti dà una precisione inferiore al secondo usando la stessa epoca, il che può essere utile.

Modifica: modificato per corrispondere all'attuale API Golang


1
So che sto resuscitando un vecchio thread, ma mi chiedo ... Python sta chiaramente documentando i problemi che ha nell'ottenere un orario preciso su piattaforme diverse. Vedi docs.python.org/2/library/time.html e cerca "precisione". Il punto è: non è perché hai un float64 che tutti i decimali sono significativi. Come viene implementato il tempo di Go, quanto posso fidarmi di questa precisione al nanosecondo?
Niriel

5
Questo non funziona qui, ma time.Now().UnixNano()( riferimento ) sì.
Jo Liss

0

Basandosi sull'idea di un'altra risposta qui, per ottenere un'interpretazione leggibile dall'uomo, puoi usare:

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
}

Provalo in The Go Playground .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.