Obtener una marca de tiempo de Unix en Go Language (tiempo actual en segundos desde época)

84

Tengo un código escrito en Go que estoy intentando actualizar para que funcione con las últimas versiones semanales. (Se construyó por última vez bajo r60). Ahora todo está funcionando, excepto el siguiente bit:

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

¿Algún consejo sobre cómo actualizar esto para que funcione con la implementación actual de Go?

crc
fuente

Respuestas:

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

fuente
41
ALERTA: El Unix()valor de retorno es de tipo int64. Truncar el int64valor de tipo para escribir int32es un ejemplo del problema del año 2038 .
peterSO
1
go1.9.2 darwin / amd64 esto devuelve consistentemente: 1969-12-31 19:00:00, que es aproximadamente equivalente a: time.Unix (0, 0). Esto es sin truncamiento.
Breedly
31

Si lo desea, stringsimplemente conviértalo a través de strconv:

package main

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

func main() {
    timestamp := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
    fmt.Println(timestamp) // prints: 1436773875771421417
}
Fatih Arslan
fuente
¿Cual es el punto de esto? Si alguien quiere convertir un número en una cadena, puede encontrar cómo hacerlo. O tal vez debería agregar otra respuesta: si desea convertirlo en un bytearray, simplemente haga [] byte (...)?
Salvador Dali
11
@SalvadorDali En realidad, esto es exactamente lo que necesitaba. Continúe y agregue su respuesta para convertirla en una matriz de bytes si lo desea, estoy seguro de que alguien llegará eventualmente y necesitará el código.
anon58192932
3
time.Now (). UTC (). UnixNano () se puede reemplazar con time.Now (). UnixNano () - el documento dice que el resultado no depende de la ubicación asociada con t.
Abu Junayd
16

Otro consejo. time.Now().UnixNano()(godoc) te dará nanosegundos desde la época. No es estrictamente tiempo de Unix, pero te da una precisión inferior a un segundo usando la misma época, lo que puede ser útil.

Editar: cambiado para que coincida con la api de golang actual

Nate
fuente
1
Sé que estoy resucitando un hilo antiguo, pero me pregunto ... Python está documentando claramente los problemas que tiene para obtener una hora precisa en diferentes plataformas. Consulte docs.python.org/2/library/time.html y busque "precisión". El punto es: no es porque tenga un float64 que todos los decimales sean significativos. ¿Cómo se implementa el tiempo de Go? ¿Cuánto puedo confiar en esta precisión de nanosegundos?
Niriel
5
Eso no funciona aquí, pero time.Now().UnixNano()( referencia ) sí.
Jo Liss
0

Basándose en la idea de otra respuesta aquí, para obtener una interpretación legible por humanos, puede usar:

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
}

Pruébelo en The Go Playground .

ivanbgd
fuente