datetime - 将 Win32 纪元的纳秒添加到 Go 时间
问题描述
我正在尝试使用 Go 处理一些 WMI 计数器(作为学习 Go 的一部分),并试图弄清楚如何生成必要的时间对象。
基数是 Win32 纪元 (1601-01-01),示例时间戳是 13224382394716547600ns(或者更确切地说,是 132243823947165476 100ns 单位)。
这是我尝试过的:
测试 1(添加纳秒)
win_epoch := time.Date(1601,1,1, 0, 0, 0, 0, time.UTC)
current_ts_1 := win_epoch.Add(13224382394716547600*time.Nanosecond)
测试 2(添加天数)
win_epoch := time.Date(1601,1,1, 0, 0, 0, 0, time.UTC)
current_ts_2 := win_epoch.AddDate(0,0,(132243823947165476/10000000 / 3600 / 24))
current_ts_1
在测试 1 中失败并出现溢出错误。
current_ts_2
在测试 2 中,我只提供了日期级别的解决方案。
理想情况下,我能够获得毫秒级的分辨率。是否存在不溢出传递给的持续时间.Add()
并仍然获得此分辨率的方法?
解决方案
这种转换需要处理一些巨大的数字。您的示例时间 13,224,382,394,716,547,600 太大而无法放入 int64(最大 9,223,372,036,854,775,807),但确实适合 unit64。
处理此问题时不能使用 time.Duration ,因为这是一个 int64 纳秒计数;正如文档所说,“该表示将最大可表示的持续时间限制为大约 290 年”。这就是您第一次尝试失败的原因。
但是,还有另一种方法可以在这里更好地创建时间func Unix(sec int64, nsec int64) Time
。这需要 unix 格式的数据,这是自 1970 年 1 月 1 日 UTC 以来的时间(或 11644473600000000000 自windows epoch以来表示为 ns )。
使用此信息可以执行转换:
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())
}
注意:我已经用一些数字检查了这一点,但建议您在依赖它之前进行进一步测试。
推荐阅读
- react-native - 反应原生 | 'react-native run-android' 命令需要运行两次才能编译
- javascript - 是否可以使用 AJAX 在 jsp 上不断显示来自 Servlet 的数据?
- python - 如何在不复制代码的情况下将相同的例外应用于多个函数?
- javascript - 如何在 Chartist.JS 中为标签添加逗号
- python - 在入口小部件上意外捕获 GTK 多输入
- javascript - 无法启动 Vue CLI 项目
- ansible - 将 2 个寄存器输出行(每个都有值列表)传递/循环到 Ansible 中的下一个任务
- c# - 如何使用 Visual Studio 2017 调试器准确判断哪行代码更改了 C# 中的给定变量?
- go - golang并发一次的问题
- sql - SQL Server:合并同一张表的两行