Время идти / голанг.Теперь.)(Unixnano () конвертировать в миллисекунды?

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

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

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

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

4 ответов


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

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 не имеет никакого эффекта. Я не знаю достаточно о go, чтобы знать, насколько вероятно, что это изменится в будущем, но для строго правильного ответа я бы использовал эту функцию, а не ответ OneOfOne. Я сомневаюсь, что есть какой-либо недостаток производительности, поскольку компилятор должен быть способный оптимизировать это совершенно хорошо.

см.https://en.wikipedia.org/wiki/Dimensional_analysis

другой способ взглянуть на это заключается в том, что оба time.Now().UnixNano() и time.Millisecond используйте те же единицы измерения (наносекунды). Пока это правда, ответ OneOfOne должен работать отлично.


сохранить его простым.

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