DOS Date和Time转化为系统时间
在一些文件类型中,会涉及到一些文件的创建、修改等时间, 这些信息被写在了文件头里面,例如Zip等格式的文档:
如果直接读原始字节流,肯定是一个无符号整数(通常是16位),这中间就涉及到了一个关于时间的转化问题。如果弄清楚了定义,事情就好办很多,不过微软家的好处就是文档丰富:
https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-dosdatetimetofiletime
这个应该能够充分说明问题了,接下来的工作就是自己写代码把各个值撸出来。
不过,多花几分钟就可以知道,其实这也是一个重复造轮子的工作,微软提供了好几个函数,就是完成这一工作的:DosDateTimeToFileTime、FileTimeToSystemTime
测试代码如下:
DosDateTimeToFileTime(lfh.LMFileDate,lfh.LMFileTime,&ft); FileTimeToSystemTime(&ft, &stUTC); //SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal); printf("Last Modified Time:%02d-%02d-%02d ",stUTC.wYear,stUTC.wMonth,stUTC.wDay); printf("%02d:%02d:%02d.%03d\n",stUTC.wHour,stUTC.wMinute,stUTC.wSecond,stUTC.wMilliseconds);
准备好DOSDATE和DOSTIME的时间,然后提供给DosDateTimeToFileTime,第三个参数带回转化后的FILETIME类型,然后用FileTimeToSystemTime把FILETIME转化为系统时间SYSTEMTIME。
系统时间就可以用人类习惯的方式查看了。其中有一行被注释了,刚以为是UTC转LTC,但是发现不注释的情况下,居然比实际时间多了8个小时(东八区嘛),看来文件时间并不会像系统时间那样搞一堆时区的问题。
测试一下,可以看到时间是一致的:
可以发现是一样的。
现在这么忙,搞很多东西都是风风火火的,所以以后写随笔的风格,肯定是信马由缰,写到哪算哪了。