Datetime 从Win32 epoch到Go time添加纳秒

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仅在日期级别上为我提供分辨率 理想情况下,我能得到这个的毫秒分辨率。是否存在一种

我正在尝试使用Go处理一些WMI计数器(作为学习Go的一部分),并试图找出如何生成必要的时间对象

基准是Win32历元(1601-01-01),样本时间戳是13224382394716547600ns(或者更确切地说,132243823947165476 100ns单位)

以下是我尝试过的:

测试1(添加纳秒) 测试2(添加天数) 测试1中的当前\u ts\u 1失败,出现溢出错误

测试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())
}