Jak uzyskać czas systemu Unix w Go w milisekundach?
Mam następującą funkcję:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
Potrzebuję mniej precyzji i chcę tylko milisekund.
Odpowiedzi:
Po prostu podziel to:
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
Oto przykład, który możesz skompilować i uruchomić, aby zobaczyć dane wyjściowe
package main
import (
"time"
"fmt"
)
func main() {
a := makeTimestamp()
fmt.Printf("%d \n", a)
}
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
Jak @Jono wskazuje w odpowiedzi @ OneOfOne, poprawna odpowiedź powinna uwzględniać czas trwania nanosekundy. Na przykład:
func makeTimestamp() int64 {
return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
Odpowiedź OneOfOne działa, ponieważ time.Nanosecond
tak się składa 1
, a dzielenie przez 1 nie ma żadnego efektu. Nie wiem wystarczająco dużo na temat idź, aby wiedzieć, jakie jest prawdopodobieństwo, że to się zmieni w przyszłości, ale dla ściśle poprawnej odpowiedzi użyłbym tej funkcji, a nie odpowiedzi OneOfOne. Wątpię, czy jest jakakolwiek wada wydajności, ponieważ kompilator powinien być w stanie doskonale to zoptymalizować.
Zobacz https://en.wikipedia.org/wiki/Dimensional_analysis
Innym sposobem patrzenia na to jest to, że oba time.Now().UnixNano()
i time.Millisecond
używają tych samych jednostek (nanosekund). Dopóki to prawda, odpowiedź OneOfOne powinna działać doskonale.
.UnixNano()
woli zawsze będzie czas w nanosekund, time.Millisecond
będą zawsze mieć wartość no, to, milisekundy domyślić, więc nawet jeśli z jakiegoś idiotycznego powodem ciągłych zmian wartości, dzieląc UnixNano przez milisekundę będzie zawsze zwraca wartość w milisekundach.
(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)
? Analiza wymiarowa ns/(ms/ns)
powraca ns^2/ms
. Twoja odpowiedź również działa, ponieważ time.Nanosecond=1
, ale jednostki są wyłączone ...
Nie komplikuj.
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
Myślę, że przed podziałem lepiej zaokrąglić czas do milisekund.
func makeTimestamp() int64 {
return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
Oto przykładowy program:
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())
}
Powyższy program wydrukował poniższy wynik na moim komputerze:
123
124
1472313624305
2016-08-28 01:00:24.305 +0900 JST
Prostym do odczytania, ale precyzyjnym rozwiązaniem byłoby:
func nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
Ta funkcja:
PS Przeprowadziłem testy porównawcze z dzielnikami stałymi i kompozytowymi, nie wykazały one prawie żadnej różnicy, więc nie krępuj się użyć rozwiązania bardziej czytelnego lub bardziej ścisłego językowo.
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond)
. Jednak najlepiej zmienić kolejność ze względu na dzielenie liczb całkowitych:time.Nanosecond * time.Now().UnixNano() / time.Millisecond