Windows 注册表中的这个 14 位数字时间格式是什么?

Windows 注册表中的这个 14 位数字时间格式是什么?

Microsoft Office 365 在注册表中以如下格式保存有关上次搜索/下载/应用更新的时间的信息:

Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\office\ClickToRun\Updates' | select *time

UpdateDetectionLastRunTime      : 13335538464958
UpdatesAppliedTime              : 13335413795690
DownloadTime                    : 13335365916104
UpdatesDiscoveryPeriodStartTime : 13259087464032
UpdatesBlockedTime              : 0

这是什么格式?如何将其转换为标准日期/时间?

答案1

这些数字是时间戳,自Windows 纪元时间,始于 1601 年 1 月 1 日,以毫秒为间隔计数。

来自微软页面如何将 Active Directory 中的日期/时间属性转换为标准时间格式

Active Directory 将日期/时间值存储为自 1601 年 1 月 1 日 0 点到存储日期/时间为止的 100 纳秒间隔数。

上面的页面描述了可以为您完成此转换的内置win32tm命令。由于您的办公时间以毫秒为单位存储,而此命令需要纳秒,因此我们需要在您的值末尾附加 4 个零以获取“完整”的 18 位时间戳代码:

w32tm /ntte 133355384649580000
154346 12:14:24.9580000 - 03/08/2023 13:14:24

由于完整的 18 位数值使用自 Windows 纪元以来的 100ns 时间间隔,因此通过从末尾删除 4 位数字,您可以将精度从 100ns 间隔降低到毫秒间隔。您可能永远不会注意到这种精度的降低。

您可以使用在线转换器验证您拥有的数字的转换,例如LDAP、Active Directory 和文件时间时间戳转换器但同样,您需要0在字符串末尾添加 4 个 s 才能获得正确的 18 位数字。

答案2

添加到@Mokubai 的回答,我认为在 PowerShell 中执行此操作的方法是使用FromFileTime函数,例如:

$time = 13335538464958
$dateTime = [DateTime]::FromFileTime($time * 10000)

这使用当地时间,还有FromFileTimeUtc使用 UTC 时间。

相关内容