Datetime 从Win32 epoch到Go time添加纳秒
我正在尝试使用Go处理一些WMI计数器(作为学习Go的一部分),并试图找出如何生成必要的时间对象 基准是Win32历元(1601-01-01),样本时间戳是13224382394716547600ns(或者更确切地说,132243823947165476 100ns单位) 以下是我尝试过的: 测试1(添加纳秒) 测试2(添加天数) 测试1中的当前\u ts\u 1失败,出现溢出错误 测试2中的Datetime 从Win32 epoch到Go time添加纳秒,datetime,go,time,Datetime,Go,Time,我正在尝试使用Go处理一些WMI计数器(作为学习Go的一部分),并试图找出如何生成必要的时间对象 基准是Win32历元(1601-01-01),样本时间戳是13224382394716547600ns(或者更确切地说,132243823947165476 100ns单位) 以下是我尝试过的: 测试1(添加纳秒) 测试2(添加天数) 测试1中的当前\u ts\u 1失败,出现溢出错误 测试2中的current_ts_2仅在日期级别上为我提供分辨率 理想情况下,我能得到这个的毫秒分辨率。是否存在一种
current_ts_2
仅在日期级别上为我提供分辨率
理想情况下,我能得到这个的毫秒分辨率。是否存在一种方法可以使传递给
.Add()
的持续时间不溢出,并且仍然获得此解决方案?此转换需要处理一些巨大的数字。您的示例时间
13224382394716547600太大,无法装入int64(最大9223372036854775807),但不能装入unit64
处理此问题时不能使用time.Duration,因为这是int64纳秒计数;正如俗语所说,“代表性将最大的代表性期限限制在大约290年”。这就是你第一次尝试失败的原因
但是,还有另一种创建时间的方法,在这里可以更好地工作func Unix(sec int64,nsec int64)time
。这以unix格式获取数据,这是自UTC 1970年1月1日以来的时间(或自UTC以来以ns表示的116444473600000000000)
使用此信息可以执行转换:
func main() {
const unixTimeBaseAsWin = 11644473600000000000 // The unix base time (January 1, 1970 UTC) as ns since Win32 epoch (1601-01-01)
const nsToSecFactor = 1000000000
timeToConvert := uint64(13224382394716547600)
unixsec := int64(timeToConvert - unixTimeBaseAsWin ) / nsToSecFactor
unixns := int64(timeToConvert % nsToSecFactor)
time := time.Unix(unixsec, unixns)
fmt.Println(time.Local())
}
注意:我已经用一些数字对此进行了检查,但建议在使用它之前进行进一步的测试。此转换需要处理一些巨大的数字。您的示例时间 13224382394716547600太大,无法装入int64(最大9223372036854775807),但不能装入unit64 处理此问题时不能使用time.Duration,因为这是int64纳秒计数;正如俗语所说,“代表性将最大的代表性期限限制在大约290年”。这就是你第一次尝试失败的原因 但是,还有另一种创建时间的方法,在这里可以更好地工作
func Unix(sec int64,nsec int64)time
。这以unix格式获取数据,这是自UTC 1970年1月1日以来的时间(或自UTC以来以ns表示的116444473600000000000)
使用此信息可以执行转换:
func main() {
const unixTimeBaseAsWin = 11644473600000000000 // The unix base time (January 1, 1970 UTC) as ns since Win32 epoch (1601-01-01)
const nsToSecFactor = 1000000000
timeToConvert := uint64(13224382394716547600)
unixsec := int64(timeToConvert - unixTimeBaseAsWin ) / nsToSecFactor
unixns := int64(timeToConvert % nsToSecFactor)
time := time.Unix(unixsec, unixns)
fmt.Println(time.Local())
}
注意:我已经用一些数字对此进行了检查,但建议在您依赖它之前进行进一步的测试
func main() {
const unixTimeBaseAsWin = 11644473600000000000 // The unix base time (January 1, 1970 UTC) as ns since Win32 epoch (1601-01-01)
const nsToSecFactor = 1000000000
timeToConvert := uint64(13224382394716547600)
unixsec := int64(timeToConvert - unixTimeBaseAsWin ) / nsToSecFactor
unixns := int64(timeToConvert % nsToSecFactor)
time := time.Unix(unixsec, unixns)
fmt.Println(time.Local())
}