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


83

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

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

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

정밀도가 덜 필요하고 밀리 초 만 원합니다.

답변:


130

그냥 나누세요 :

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

40
위의 계산은 실제로 의미가 없습니다. 나노초를 밀리 초로 나누지 않습니다. golang이 시간을 나노초까지 나타내도록 선택했고 상수 'Millisecond'는 1,000,000입니다. 수학적으로 말하면 계산은 다음과 같아야합니다 time.Now().UnixNano() * (time.Nanosecond / time.Millisecond).. 그러나 정수 나누기 때문에 순서를 변경하는 것이 가장 좋습니다.time.Nanosecond * time.Now().UnixNano() / time.Millisecond
Jonno 2014

4
감사합니다. 그 보증에 의존하는 것은 환영하지만 이것은 사실상 Y2K 버그입니다. 미래의 어느 시점에서 깨질 수 있습니다. 왜 잘못된 수학적 표현을 선택합니까?
Jonno 2014

2
임의의 상수입니다. 그들은 미래에 바뀔 수 있습니다. 시간 패키지는 현재 나노초 정밀도로 "작동"하지만 임의의 선택으로 time.Millisecond = 1,000,000을 설정합니다. 참조한 동일한 파일에서도 time.Milisecond는 1000 * Microsecond로 설정됩니다. 수학적으로 말하면 그것이 나타내는 것이기 때문입니다. 오프라인으로 전환-내 설명이 도움이
되기를 바랍니다

11
-1 이것은 단지 잘못되었습니다. 당신의 단위는 합산되지 않습니다. 물리학에서 차원 분석을 찾아보십시오. 결과는 시간을 나타내지 않습니다.
Kugel

7
바쁜 사람들을위한 빠른 답변. 봐 https://gobyexample.com/epoch
honzajde

64

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


4
의 값 .UnixNano()의 뜻은 항상 , 나노초의 시간이 될 time.Millisecond것입니다 항상 아니라, 당신이, 밀리 초를 짐작를 들어, 값이 너무 심지어 상수는 것이다 밀리 초 단위로 UnixNano 나누어, 값을 변경 바보 어떤 이유로 경우 항상 밀리 세컨드의 값을 반환합니다.
OneOfOne

9
Unix.Nano의 단위는 문제가되지 않습니다. 시간의 가치도 아닙니다. 무엇 이다 질문하는 것은 time.Millisecond의 단위입니다. 그것은 나노초 단위로 정의되기 때문에 귀하의 답변이 작동하는 이유입니다. time.Milliseconds가 다른 단위 (예 : 마이크로 초)로 측정 된 경우 제공 한 대답은 작동하지 않습니다.
Bjorn Roche

2
@BjornRoche 나는이 파티에 조금 늦었지만 정답이 (int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)아닐까요? 차원 분석 ns/(ms/ns)은를 반환합니다 ns^2/ms. 당신의 대답도하기 때문에 작동 time.Nanosecond=1하지만, 단위는 ... 꺼져
푸마

1
@thepuma 오랜만에 이걸 잘못 보거나 오해 할 수도 있지만 ns / (ms / ns)는 ns ^ 2 / ms와 동일하므로 두 답변 모두 작동합니다.
Bjorn Roche

이 대답을 실행하면 온라인 변환기 unitconverters.net/prefixes/nano-to-milli.htm을
user666

55

단순하게 유지하십시오.

func NowAsUnixMilli() int64 {
    return time.Now().UnixNano() / 1e6
}

2

나누기 전에 시간을 밀리 초로 반올림하는 것이 좋습니다.

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

시간을 밀리 초로 반올림하는 것이 더 낫다고 생각하는 이유를 언급하는 것을 잊었습니다.
Gurpartap Singh은

1

간단하지만 정확한 솔루션은 다음과 같습니다.

func nowAsUnixMilliseconds(){
    return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}

이 기능 :

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

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


밀리 초 (에포크 이후 밀리 초) 단위로 올바른 Unix 시간을 알고 싶다면 Round ()를 사용하지 않아야합니다. 시간의 절반이 반올림되고 결과에는 아직 완전히 경과하지 않은 밀리 초가 포함됩니다.
torbenl

@torbenl에 메모 해 주셔서 감사합니다. 이것은 대부분의 시스템에서 중요 할 수 있습니다 (내는 제외이며 이번에는 기록 용으로 만 저장 됨).
Liubov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.