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