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

如何考虑时区与DST,比较NTFS和FAT32文件的QDateTime修改时间?

文件时间戳比较:夏令时与Qt处理方案

Qt对夏令时的处理局限

Qt的QDateTime本身支持时区和夏令时解析,但问题根源在文件系统的时间存储逻辑:

  • NTFS存储UTC时间戳,不受本地时区/夏令时切换影响;
  • FAT32仅存储本地时间戳,无时区或夏令时元数据,完全依赖当前系统的时区设置解析。

你遇到的场景:夏令时期间复制文件时,FAT32记录的是当时的夏令时本地时间;切换到标准时间重启后,系统用当前标准时区解析这个旧本地时间,导致转UTC时比NTFS的真实UTC时间少1小时,出现差值。

Qt无法自动识别FAT32时间戳对应的夏令时状态——因为该信息根本没被存储,所以单靠Qt的时间解析无法直接消除这个差值。

无需WinAPI/STL的解决方案

核心思路是统一用UTC时间基准比较,同时允许夏令时切换带来的1小时误差范围:

代码实现

// 获取文件修改时间并转换为UTC
QDateTime sourceUtc = sourceFileInfo.lastModified().toUTC();
QDateTime targetUtc = targetFileInfo.lastModified().toUTC();

// 转换为毫秒级时间戳
qint64 sourceMs = sourceUtc.toMSecsSinceEpoch();
qint64 targetMs = targetUtc.toMSecsSinceEpoch();

// 对NTFS时间戳做FAT32的2秒精度对齐
qint64 sourceAdjusted = ((sourceMs + 1999) / 2000) * 2000;
// FAT32时间戳本身就是2秒精度,统一对齐更严谨
qint64 targetAdjusted = ((targetMs + 1999) / 2000) * 2000;

// 计算时间差,允许±3600秒的夏令时切换误差
qint64 diff = qAbs(sourceAdjusted - targetAdjusted);
if (diff > 3600 * 1000) {
    // 文件已修改,与副本不一致
} else {
    // 未修改,差值由夏令时切换导致
}

关键说明

  • 之前使用Qt::UTC和Qt::LocalTime结果一致,是因为两者都是基于当前系统时区转换的,但FAT32的时间戳是在旧时区(夏令时)下记录的,当前解析时用了新时区(标准时间),导致转UTC后出现偏差。
  • 允许1小时误差是权衡方案:因为FAT32不存储夏令时信息,无法精准还原原始UTC时间,只能通过误差范围覆盖夏令时切换的影响。

内容的提问来源于stack exchange,提问作者riverofwind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:20:32