You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:08:14