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个小时(东八区嘛),看来文件时间并不会像系统时间那样搞一堆时区的问题。

测试一下,可以看到时间是一致的:

 可以发现是一样的。

 

现在这么忙,搞很多东西都是风风火火的,所以以后写随笔的风格,肯定是信马由缰,写到哪算哪了。

posted @ 2019-11-27 18:59  castor_xu  阅读(1143)  评论(0编辑  收藏  举报