Як я можу отримати час Unix в Go в мілісекундах?
Я маю таку функцію:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
Мені потрібно менше точності і потрібно лише мілісекунди.
Відповіді:
Просто розділіть:
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
Ось приклад, який ви можете скомпілювати та запустити, щоб переглянути вихідні дані
package main
import (
"time"
"fmt"
)
func main() {
a := makeTimestamp()
fmt.Printf("%d \n", a)
}
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
Як зазначає @Jono у відповіді @ OneOfOne, правильна відповідь повинна враховувати тривалість наносекунди. Наприклад:
func makeTimestamp() int64 {
return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
Відповідь OneOfOne працює, тому що time.Nanosecond
трапляється 1
, і ділення на 1 не має ефекту. Я недостатньо знаю про те, щоб дізнатись, наскільки ймовірно це зміниться в майбутньому, але для суворо правильної відповіді я б використав цю функцію, а не відповідь OneOfOne. Я сумніваюся, що є якісь недоліки в продуктивності, оскільки компілятор повинен мати можливість чудово оптимізувати це.
Див. Https://en.wikipedia.org/wiki/Dimensional_analysis
Інший спосіб розглянути це те, що обидва time.Now().UnixNano()
і time.Millisecond
використовують однакові одиниці виміру (наносекунди). Поки це правда, відповідь OneOfOne повинна працювати абсолютно добре.
.UnixNano()
волі завжди буде час в наносекундах, time.Millisecond
буде завжди мати значення для добре, як ви вже здогадалися, мілісекунди, так що навіть якщо з якоїсь - то ідіотської причини постійної зміни значення, розділивши UnixNano на мілісекунді буде завжди повертати значення в мілісекундах.
(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)
? ns/(ms/ns)
Повертається розмірний аналіз ns^2/ms
. Ваша відповідь також працює, бо time.Nanosecond=1
одиниці вимкнені ...
Не ускладнювати.
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
Я думаю, що краще поділити час на мілісекунди до поділу.
func makeTimestamp() int64 {
return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
Ось приклад програми:
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())
}
Наведена вище програма надрукувала на моїй машині результат нижче:
123
124
1472313624305
2016-08-28 01:00:24.305 +0900 JST
Простим для читання, але точним рішенням буде:
func nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
Ця функція:
PS Я запустив тести з постійними та композитними дільниками, вони майже не показали різниці, тому сміливо використовуйте більш читабельне або суворіше для мови рішення.
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond)
. Однак найкраще змінити порядок через цілочисельне ділення:time.Nanosecond * time.Now().UnixNano() / time.Millisecond