language - Go/golang time.Now(). UnixNano() convierte a milisegundos?
golang weekday (4)
¿Cómo puedo obtener el tiempo de Unix en Ir en milisegundos?
Tengo la siguiente función:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
Necesito menos precisión y solo quiero milisegundos.
Como @Jono señala en la respuesta de @ OneOfOne, la respuesta correcta debe tener en cuenta la duración de un nanosegundo. P.ej:
func makeTimestamp() int64 {
return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
La respuesta de OneOfOne funciona porque el tiempo. time.Nanosecond
es 1
y dividir por 1 no tiene ningún efecto. No sé lo suficiente sobre cómo saber qué probabilidades hay de que esto cambie en el futuro, pero para la respuesta estrictamente correcta usaría esta función, no la respuesta de OneOfOne. Dudo que haya alguna desventaja de rendimiento, ya que el compilador debería poder optimizar esto perfectamente.
Ver https://en.wikipedia.org/wiki/Dimensional_analysis
Otra forma de ver esto es que tanto time.Now().UnixNano()
y time.Millisecond
usan las mismas unidades (Nanosegundos). Mientras eso sea cierto, la respuesta de OneOfOne debería funcionar perfectamente.
Creo que es mejor redondear el tiempo a milisegundos antes de la división.
func makeTimestamp() int64 {
return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
Aquí hay un programa de ejemplo:
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(unixMilli(time.Unix(0, 123400000)))
fmt.Println(unixMilli(time.Unix(0, 123500000)))
m := makeTimestampMilli()
fmt.Println(m)
fmt.Println(time.Unix(m/1e3, (m%1e3)*int64(time.Millisecond)/int64(time.Nanosecond)))
}
func unixMilli(t time.Time) int64 {
return t.Round(time.Millisecond).UnixNano() / (int64(time.Millisecond) / int64(time.Nanosecond))
}
func makeTimestampMilli() int64 {
return unixMilli(time.Now())
}
El programa anterior imprimió el resultado a continuación en mi máquina:
123
124
1472313624305
2016-08-28 01:00:24.305 +0900 JST
Mantenlo simple.
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
Solo divídelo
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
Aquí hay un ejemplo que puede compilar y ejecutar para ver la salida
package main
import (
"time"
"fmt"
)
func main() {
a := makeTimestamp()
fmt.Printf("%d /n", a)
}
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}