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
}
이 기능 :
- 값을 가장 가까운 밀리 초로 올림합니다 (정수 나눗셈과 비교 : 결과 값의 소수 부분 만 버립니다).
- 절대 밀리 초 / 나노초 디바이더를 나타내는 숫자 상수를 사용하기 때문에 Go 관련 time.Duration 강제에 대해 자세히 살펴 보지 않습니다.
추신 : 상수 및 복합 분배기로 벤치 마크를 실행했지만 거의 차이가 없었으므로 더 읽기 쉽고 언어에 엄격한 솔루션을 자유롭게 사용하십시오.