bfgxp 发表于 2020-5-1 18:08:31

像0x01D61304这样的日期编码如何转换成年月日【已解决】

本帖最后由 bfgxp 于 2020-5-28 15:01 编辑

wim镜像导出的xml文件,记录的日期和时间就是这样的编码,该如何转换为年月日时分秒?
<CREATIONTIME>
<HIGHPART>0x01D61304</HIGHPART>
<LOWPART>0x0581EA62</LOWPART>
</CREATIONTIME>
<LASTMODIFICATIONTIME>
<HIGHPART>0x01D61304</HIGHPART>
<LOWPART>0x07DCCDBD</LOWPART>
</LASTMODIFICATIONTIME>

繁星 发表于 2020-5-2 23:14:32

本帖最后由 繁星 于 2020-5-3 00:59 编辑

help里边现成的不知道对不对
Local $HIGHPART = '0x01D61304', _
      $LOWPART1 = '0x0581EA62', _
      $LOWPART2 = '0x07DCCDBD'

ConsoleWrite('CREATIONTIME:' & _FormatTime($HIGHPART, $LOWPART1) & _
@CRLF & 'LASTMODIFICATIONTIME:' & _FormatTime($HIGHPART, $LOWPART2) & @CRLF)

Func _FormatTime($HIGHPART, $LOWPART)
      Local $tagFILETIME = DllStructCreate('struct; dword Lo;dword Hi; endstruct'), _
                $tagSYSTEMTIME = DllStructCreate('struct; word Year;word Month;word Dow;word Day;word Hour;word Minute;word Second;word MSeconds; endstruct')
      DllStructSetData($tagFILETIME, 'Hi', Dec(StringTrimLeft($HIGHPART, 2)))
      DllStructSetData($tagFILETIME, 'Lo', Dec(StringTrimLeft($LOWPART, 2)))
      DllCall('kernel32.dll', 'bool', 'FileTimeToSystemTime', 'struct*', $tagFILETIME, 'struct*', $tagSYSTEMTIME)
      Return StringFormat("%04d/%02d/%02d %02d:%02d:%02d", _
                DllStructGetData($tagSYSTEMTIME, "Year"), _
      DllStructGetData($tagSYSTEMTIME, "Month"), _
                DllStructGetData($tagSYSTEMTIME, "Day"), _
                DllStructGetData($tagSYSTEMTIME, "Hour"), _
                DllStructGetData($tagSYSTEMTIME, "Minute"), _
                DllStructGetData($tagSYSTEMTIME, "Second"))
EndFunc

yuantian 发表于 2020-5-3 00:52:57

繁星 发表于 2020-5-2 23:14
不知道对不对

大神,请教一下,什么原理??
看的蒙蒙的。。。
:face (13):

bfgxp 发表于 2020-5-3 07:27:05

自己找到了答案,高低位的16进制去0x用“&”连接,然后转换成10进制,得到的数是自1601年1月1日0时0分0秒以来所经历的100纳秒的倍数
处理方法就是
$iDec = int(Dec("01D613040581EA62", $NUMBER_AUTO)/10000000)
$sNewDate = _DateAdd( 's',$iDec, "1601/01/01 00:00:00")
MsgBox( 4096, "", "Date: " & $sNewDate )

xzf680 发表于 2020-5-3 12:10:45

$NUMBER_AUTO 是什么?看来还是二楼的正确

Dontang2018 发表于 2020-5-3 14:16:40

参考学习,参考学习

yuantian 发表于 2020-5-3 17:44:11

bfgxp 发表于 2020-5-3 07:27
自己找到了答案,高低位的16进制去0x用“&”连接,然后转换成10进制,得到的数是自1601年1月1日0时0分0秒以 ...

同样的疑问,为什么是“1601/01/01 00:00:00”??

bfgxp 发表于 2020-5-3 18:35:00

yuantian 发表于 2020-5-3 17:44
同样的疑问,为什么是“1601/01/01 00:00:00”??

不知道,这是微软的说明
https://docs.microsoft.com/zh-cn/windows/win32/api/minwinbase/ns-minwinbase-filetime?redirectedfrom=MSDN

yuantian 发表于 2020-5-3 20:20:23

bfgxp 发表于 2020-5-3 18:35
不知道,这是微软的说明
https://docs.microsoft.com/zh-cn/windows/win32/api/minwinbase/ns-minwinbas ...

好的,谢谢。
页: [1]
查看完整版本: 像0x01D61304这样的日期编码如何转换成年月日【已解决】