web-dev-qa-db-fra.com

Go / golang time.Now (). UnixNano () convertir en millisecondes?

Comment obtenir le temps Unix dans Go en millisecondes?

J'ai la fonction suivante:

func makeTimestamp() int64 {
    return time.Now().UnixNano() % 1e6 / 1e3
}

J'ai besoin de moins de précision et je ne veux que des millisecondes.

60
mconlin

Il suffit de le diviser:

func makeTimestamp() int64 {
    return time.Now().UnixNano() / int64(time.Millisecond)
}

Voici un exemple que vous pouvez compiler et exécuter pour afficher le résultat

package main

import (
    "time"
    "fmt"
)

func main() {
    a := makeTimestamp()

    fmt.Printf("%d \n", a)
}

func makeTimestamp() int64 {
    return time.Now().UnixNano() / int64(time.Millisecond)
}
93
OneOfOne

Comme @Jono le souligne dans la réponse de @ OneOfOne, la réponse correcte doit prendre en compte la durée d'une nanoseconde. Par exemple:

func makeTimestamp() int64 {
    return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}

La réponse de OneOfOne fonctionne car time.Nanosecond Se trouve être 1, Et la division par 1 n'a aucun effet. Je ne sais pas assez pour savoir à quel point cela est susceptible de changer à l'avenir, mais j'utiliserais cette fonction pour la réponse tout à fait correcte, pas la réponse de OneOfOne. Je doute qu'il y ait un inconvénient en termes de performances, car le compilateur devrait pouvoir l'optimiser parfaitement.

Voir https://en.wikipedia.org/wiki/analyse de dimensions

Une autre façon de voir les choses est que time.Now().UnixNano() et time.Millisecond Utilisent les mêmes unités (nanosecondes). Tant que cela est vrai, la réponse de OneOfOne devrait parfaitement fonctionner.

53
Bjorn Roche

Rester simple.

func NowAsUnixMilli() int64 {
    return time.Now().UnixNano() / 1e6
}
32
stratovarius

Je pense qu'il est préférable d'arrêter le temps en millisecondes avant la division.

func makeTimestamp() int64 {
    return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}

Voici un exemple de programme:

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())
}

Le programme ci-dessus a imprimé le résultat ci-dessous sur ma machine:

123
124
1472313624305
2016-08-28 01:00:24.305 +0900 JST
0
hnakamur