DOS Date和Time转化为系统时间

在一些文件类型中,会涉及到一些文件的创建、修改等时间, 这些信息被写在了文件头里面,例如Zip等格式的文档:

DOS Date和Time转化为系统时间

如果直接读原始字节流,肯定是一个无符号整数(通常是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个小时(东八区嘛),看来文件时间并不会像系统时间那样搞一堆时区的问题。

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

DOS Date和Time转化为系统时间

DOS Date和Time转化为系统时间

 

上一篇:【简单】时间日期格式转换


下一篇:模拟 : 1026 程序运行时间 (15 分)