使用Win32 API渲染事件时FileTime转SystemTime时间不符问题排查
问题原因及解决方法
你遇到的时间不一致问题,核心原因是Win32事件日志里的TimeCreated对应的FileTime是UTC时间,而事件查看器默认显示的是你的本地时区时间。你的代码直接用FileTimeToSystemTime转换得到的是UTC时间,自然和事件查看器的本地时间对不上。
修正步骤
需要先把UTC的FileTime转成本地时区的FileTime,再转换成SystemTime,具体要加一步FileTimeToLocalFileTime调用:
修改后的代码
ullTimeStamp = pRenderedValues[EvtSystemTimeCreated].FileTimeVal; ft.dwHighDateTime = (DWORD)((ullTimeStamp >> 32) & 0xFFFFFFFF); ft.dwLowDateTime = (DWORD)(ullTimeStamp & 0xFFFFFFFF); // 新增:将UTC FileTime转成本地时区的FileTime FILETIME localFt; if (!FileTimeToLocalFileTime(&ft, &localFt)) { // 处理转换失败的情况,比如调用GetLastError()查错 } // 用本地FileTime转SystemTime FileTimeToSystemTime(&localFt, &st); ullNanoseconds = (ullTimeStamp % 10000000) * 100; wprintf(L"TimeCreated LocalTime: %02d/%02d/%02d %02d:%02d:%02d.%I64u)\n", st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond, ullNanoseconds); wprintf(L"EventRecordID: %I64u\n", pRenderedValues[EvtSystemEventRecordId].UInt64Val);
额外注意点
- 纳秒计算部分是对的:FileTime以100纳秒为单位,取模10000000(对应1秒的100纳秒数)再乘100,就能得到毫秒后的纳秒部分,这部分和事件查看器的显示逻辑匹配。
- 如果系统时区设置了夏令时,
FileTimeToLocalFileTime会自动处理夏令时的时间偏移,不需要额外手动计算。
内容的提问来源于stack exchange,提问作者NImIPKZvUc
相关产品推荐
相关产品推荐

