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.
time
go
unix-timestamp
date-conversion
mconlin
źródło
źródło
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
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łada1
, 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()
itime.Millisecond
używają tych samych jednostek (nanosekund). Dopóki to prawda, odpowiedź OneOfOne powinna działać doskonale.źródło
.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 wymiarowans/(ms/ns)
powracans^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 }
źródło
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
źródło
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.
źródło