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 时间。