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

Cpt*_*ale 26 powershell date-time timestamp conversion office365

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

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

UpdateDetectionLastRunTime      : 13335538464958
UpdatesAppliedTime              : 13335413795690
DownloadTime                    : 13335365916104
UpdatesDiscoveryPeriodStartTime : 13259087464032
UpdatesBlockedTime              : 0
Run Code Online (Sandbox Code Playgroud)

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

Mok*_*bai 37

这些数字是自Windows Epoch Time(从 1601 年 1 月 1 日开始)以来的时间戳,以毫秒间隔计数。

从 Microsoft 页面如何将 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
Run Code Online (Sandbox Code Playgroud)

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

您可以使用在线转换器(例如LDAP、Active Directory 和 Filetime Timestamp Converter)验证从您拥有的数字进行的转换,但您再次需要0在字符串末尾添加四个 s 以获得正确的 18 位值。

  • “自...以来经过的 100 纳秒间隔数”。Dave Cutler 和 DEC VMS 的幽灵仍然存在。 (2认同)

Des*_*666 22

要添加@Mokubai的答案,在PowerShell中执行此操作的方法(我认为这里需要这种方法)是使用FromFileTime函数,例如:

$time = 13335538464958
$dateTime = [DateTime]::FromFileTime($time * 10000)
Run Code Online (Sandbox Code Playgroud)

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

  • 好的。我正在编辑以提供更权威的来源和一个也可以进行转换的 Windows 命令。 (4认同)