2015-06-06 36 views
0

我想在Windows NT關機時間轉換日期和時間:轉換REG_BINARY值(64位十六進制值 - 小端)日期和時間

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

輸入的數據是這樣的64位十六進制值(8字節)。您可以在HKLM\SYSTEM\ControlSet001\Control\Windows --> Shutdown Time下的Windows註冊表中找到此值。該值包含上次關機的時間和日期。值類型爲FILETIME - 一個64位時間值(十六進制值,小端序),表示從1601年1月1日午夜UTC以來的每隔100納秒的間隔數。

這是可能通過shell(bash)嗎?我想在shell腳本中實現它。

+1

你知道如何計算的作品?如果是這樣,這可以很容易地使用shell工具完成。輸入數據的格式是什麼?請[編輯]您的問題以提供更多詳細信息。 –

+1

就像我說的,[編輯]你的問題,而不是使用評論來添加更多的細節。 shell腳本應該如何訪問這個值?它是在文本文件中,還是在shell變量中,或者是什麼? –

+0

這不是我的問題!我已經有了這個值。 – user3022917

回答

1

正如問題中所寫,Windows NT關閉時間從1601年1月1日開始計數爲100ns。唯一的問題是時間戳被編碼爲小尾數。解碼時間戳並將其添加到紀元在純粹的Bash中有點棘手,但如果您可以備份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()格式說明符編輯最後一行。

+0

我在我的Mac上將/ usr/bin/python3更改爲/ usr/local/bin/python3。非常感謝您的幫助! – user3022917

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 

更多的知識得到這個一個here