Подтвердить что ты не робот

Go/golang time.Now(). UnixNano() конвертировать в миллисекунды?

Как я могу получить Unix-время в Go в миллисекундах?

У меня есть следующая функция:

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

Мне нужна меньшая точность и требуется только миллисекунды.

4b9b3361

Ответ 1

Просто разделите его:

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

Ответ 2

Как @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 ответ должен работать отлично.

Ответ 3

Я думаю, что лучше округлить время до миллисекунд перед делением.

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