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의 대답은 완벽하게 잘 작동합니다.
.UnixNano()의 뜻은 항상 , 나노초의 시간이 될 time.Millisecond것입니다 항상 아니라, 당신이, 밀리 초를 짐작를 들어, 값이 너무 심지어 상수는 것이다 밀리 초 단위로 UnixNano 나누어, 값을 변경 바보 어떤 이유로 경우 항상 밀리 세컨드의 값을 반환합니다.
(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)아닐까요? 차원 분석 ns/(ms/ns)은를 반환합니다 ns^2/ms. 당신의 대답도하기 때문에 작동 time.Nanosecond=1하지만, 단위는 ... 꺼져
단순하게 유지하십시오.
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
}
이 기능 :
추신 : 상수 및 복합 분배기로 벤치 마크를 실행했지만 거의 차이가 없었으므로 더 읽기 쉽고 언어에 엄격한 솔루션을 자유롭게 사용하십시오.
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond).. 그러나 정수 나누기 때문에 순서를 변경하는 것이 가장 좋습니다.time.Nanosecond * time.Now().UnixNano() / time.Millisecond