Как я могу получить Unix-время в Go в миллисекундах?
У меня есть следующая функция:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
Мне нужна меньшая точность и требуется только миллисекунды.
Как я могу получить 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
используют одни и те же единицы (Nanoseconds). Пока это так, OneOfOne ответ должен работать отлично.
Я думаю, что лучше округлить время до миллисекунд перед делением.
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