1

我想将 Windows NT 关机时间转换为日期和时间:

88 33 9d cb 38 36 d0 01 --> 88339dcb3836d001 --> 22.01.2015 11:44:35 (UTC)

输入数据是这个 64 位十六进制值(8 个字节)。您可以在 Windows 注册表中找到此值HKLM\SYSTEM\ControlSet001\Control\Windows --> Shutdown Time。此值包含上次关闭的时间和日期。该值的类型为FILETIME- 一个 64 位时间值(十六进制值,Little Endian),表示自 1601 年 1 月 1 日午夜 UTC 以来的 100 纳秒间隔数。

这可以通过shell(bash)实现吗?我想在 shell 脚本中实现它。

4

2 回答 2

2

正如问题中所写,Windows NT 关闭时间是从 1601 年 1 月 1 日开始计算的 100ns 间隔。唯一的问题是时间戳被编码为 little-endian。在纯 Bash 中解码时间戳并将其添加到 epoch 有点棘手,但如果您可以节省 Python 安装,则变得相当容易。

这是一个执行转换的脚本:

#! /usr/bin/python3

from __future__ import division
import struct
import sys
from binascii import unhexlify
from datetime import datetime, timedelta

nt_timestamp = struct.unpack("<Q", unhexlify(sys.argv[1]))[0]
epoch = datetime(1601, 1, 1, 0, 0, 0)
nt_datetime = epoch + timedelta(microseconds=nt_timestamp / 10)

print(nt_datetime.strftime("%c"))

它接受 64 位值作为参数并打印编码日期的语言环境表示:

$ ./nttime.py 88339dcb3836d001
Thu Jan 22 11:44:35 2015

strftime()如果您需要其他格式,请使用标准格式说明符编辑最后一行。

于 2015-06-06T10:35:20.723 回答
0

分享更多知识:-)

$regKey = Get-ItemProperty -Path
Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Windows
$shutDown = $regKey.ShutdownTime
$Int64Value = [System.BitConverter]::ToInt64($shutDown, 0)
$date = [DateTime]::FromFileTime($Int64Value)

$date

有这个在这里

于 2017-03-13T03:37:55.743 回答