如何考虑时区与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
相关产品推荐
相关产品推荐

