在windows下获取了文件的最后修改时间FILETIME,由于它是32位而DOS是16位的,因此我进行了如下转换,用FileTimeToDosDateTime函数进行转换
据个例子
假设某文件的最后访问时间为:2004-06-17 18:15:18
DOS下用getftime获取时间,其时间为结构体struct ftime ft(变量),大小为4个字节。
直接用printf(“%ld”,ft)数据结果是819040745,十六进制为30D190DB
用printf("%d-%d....",ft.year,ft.month...)输出结果为2004-06-17 18:15:18
win下用GetFileTime获取时间, 并用FileTimeToDosDataTime进行转换
日期为:12497,十六进制为:30D1
时间为:20969,十六进制为:51E9
『考虑到时区,应该在小时加8,因此,时间为:37353,十六进制为:91E9』在这里,问题出现,日期相同,但是时间不一样了一个是90DB,一个是91E9,完全不一样,根据其存储格式,时间的存储格式,经过手工转换,90DB转换后时间变成18:06:54,而不是18:15:18,大侠们,这是怎么回事???等待中。。

解决方案 »

  1.   

    1.FILETIME他是8个字节的结构体。
    2.不应该小时上加8,而是在整个的FILETIME上加上 8 * 60 * 60 * 1000000000 / 100
      

  2.   

    FILETIME是8个字节,这我知道
    当通过FileTimeToDosDataTime转换之后就成为了4个字节,其中2个字节表示日期,另外2个字节表示时间,而时间加上8之后就是文件的最后访问时间我的问题是转换之后跟DOS下直接读取的值不一样,既加上8之后的4个字节数值跟DOS下的4个字节数值是不一样的
      

  3.   

    FILETIME是从1601年1月1号,到目前过去的纳秒数,所以八小时应该是加到正个FILETIME上,而不是只给时间加八,例如2004-1-1 23:00:00 如果只给时间部分加八小时和给整个时间加八小时是一样的吗?
      

  4.   

    可是我如果只给小时加上8小时,那么经过手工换算,正好跟最后访问时间对上。如果整个时间都加上8小时,即8×3600秒,那么变为C269,手工换算后成为24:19:18,完全不符合要求。现在将日期bit存储的格式说明如下:
    高5位15-11表示小时
    中间6位10-5表示分钟
    低5位4-0表示秒1/2