首页
社区
课程
招聘
[旧帖] [求助]使用FileTimeToSystemTime时遇到的时区问题 0.00雪花
发表于: 2011-8-27 18:02 2581

[旧帖] [求助]使用FileTimeToSystemTime时遇到的时区问题 0.00雪花

2011-8-27 18:02
2581
最近遇到要修改文件时间,过程中用到了FileTimeToSystemTime这个API函数

该函数的功能大概就是将FILETIME结构中的时间转化为系统时间SYSTEMTIME结构:

typedef struct _SYSTEMTIME {
  WORD wYear;
  WORD wMonth;
  WORD wDayOfWeek;
  WORD wDay;
  WORD wHour;
  WORD wMinute;
  WORD wSecond;
  WORD wMilliseconds;
} SYSTEMTIME,  *PSYSTEMTIME;

在我的测试程序中将固定的一个FILETIME转化为SYSTEMTIME后,得到的时间是2011年5月23日1点56分58秒
而文件的真实修改时间是2011年5月23日9点56分58秒
明显一看少了8个小时,所以返回的时间是UTC时间,相差8个小时

接下来,我将系统时区该为其他时区,再运行程序得到的结果还是:
2011年5月23日1点56分58秒

这我就迷惑了,为啥我改了时区后还是9点呢?还是相差8个小时呢?照理相差的应该是我修改的时区啊?难道系统还有什么内置的时区没有修改到导致还是8个小时的时差?

希望有人能解惑,谢谢!!

附件是测试程序,大家可以修改时区后测试,FILETTIME的值是我指定的文件修改时间为2011年5月23日9点56分58秒
的值

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 2943
活跃值: (1788)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
2
FileTime--->FileLocalTime--->SystemTime

004030AC  DB 07 05 00 01 00 17 00 01 00 38 00 3A 00 00 00  ?....8.:...
004030BC  00 11 EB B2 EC 18 CC 01                          .氩??...

00401000 >  68 00304000     push    00403000
00401005    E8 46000000     call    <jmp.&kernel32.GetTimeZoneInformatio>
0040100A    B8 0011EBB2     mov     eax, 0xB2EB1100
0040100F    BA EC18CC01     mov     edx, 0x1CC18EC
00401014    A3 BC304000     mov     dword ptr [0x4030BC], eax
00401019    8915 C0304000   mov     dword ptr [0x4030C0], edx
0040101F    68 AC304000     push    004030AC
00401024    68 BC304000     push    004030BC
00401029    E8 1C000000     call    <jmp.&kernel32.FileTimeToSystemTime>
0040102E    68 BC304000     push    004030BC
00401033    68 AC304000     push    004030AC
00401038    E8 19000000     call    <jmp.&kernel32.SystemTimeToFileTime>
0040103D    6A 00           push    0x0
0040103F    E8 00000000     call    <jmp.&kernel32.ExitProcess>
00401044  - FF25 04204000   jmp     dword ptr [<&kernel32.ExitProcess>]  ; kernel32.ExitProcess
0040104A  - FF25 08204000   jmp     dword ptr [<&kernel32.FileTimeToSyst>; kernel32.FileTimeToSystemTime
00401050  - FF25 0C204000   jmp     dword ptr [<&kernel32.GetTimeZoneInf>; kernel32.GetTimeZoneInformation
00401056  - FF25 00204000   jmp     dword ptr [<&kernel32.SystemTimeToFi>; kernel32.SystemTimeToFileTime
2011-8-29 07:23
0
雪    币: 78
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
[QUOTE='wofan[OCN];995349']FileTime--->FileLocalTime--->SystemTime

004030AC  DB 07 05 00 01 00 17 00 01 00 38 00 3A 00 00 00  ?....8.:...
004030BC  00 11 EB B2 EC 18 CC ...[/QUOTE]

非常感谢大牛点拨,原来GetFileTime通过FILETIME数据结构获取的数据是UTC时间,所以我怎么改时区然后通过FileTimeToSystemTime函数得到的都是UTC时间

应该使用FileTimeToLocalTime函数先将时间转化为本地时间,比如我的机器是北京时区,也就是会将FILETIME加上8个小时

最后再使用FileTimeToSystemTime得到当前系统的时间,如果我的时区修改为+7或者其它情况,最终得到的值就是正确的了!!

也就是大牛所说的:FileTime--->FileLocalTime--->SystemTime
2011-9-17 21:09
0
游客
登录 | 注册 方可回帖
返回
//