[time] Go / golang time.Now (). UnixNano () 밀리 초로 변환?

Go에서 Unix 시간을 밀리 초 단위로 얻으려면 어떻게해야합니까?

다음과 같은 기능이 있습니다.

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의 대답은 완벽하게 잘 작동합니다.


답변

단순하게 유지하십시오.

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
}

이 기능 :

  1. 값을 가장 가까운 밀리 초로 올림합니다 (정수 나눗셈과 비교 : 결과 값의 소수 부분 만 버립니다).
  2. 절대 밀리 초 / 나노초 디바이더를 나타내는 숫자 상수를 사용하기 때문에 Go 관련 time.Duration 강제에 대해 자세히 살펴 보지 않습니다.

추신 : 상수 및 복합 분배기로 벤치 마크를 실행했지만 거의 차이가 없었으므로 더 읽기 쉽고 언어에 엄격한 솔루션을 자유롭게 사용하십시오.


답변