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

QT 5.15.2中QDate::daysTo返回0问题求助

QT 5.15.2中文件创建时间daysTo返回0的问题分析

核心问题根源

从调试信息能看到,birthTime()返回的时间仅包含毫秒数(如msecs=280348),缺少完整的年/月/日信息,导致提取出的date()和today是同一天,所以daysTo()必然返回0。主要原因有两点:

  • 跨平台兼容性限制:
    QT的birthTime()/created()在不同系统上的实现存在差异:

    • Linux下多数默认文件系统(如ext4)未开启创建时间记录,或者QT 5.15.2版本对Linux创建时间的读取支持不完善,无法获取完整时间戳。
    • 部分平台上QFileDevice::FileBirthTime枚举未能正确映射到系统原生的创建时间字段。
  • QFileInfo延迟加载机制:
    QDir的entryInfoList()默认不会预加载所有文件属性,包括创建时间。如果未触发属性刷新,birthTime()会返回不完整的默认值。

解决方法

  1. 强制刷新文件属性
    在访问创建时间前调用refresh(),确保加载完整的文件元数据:

    const QDate today = QDate::currentDate();
    QDir dir("folderName");
    foreach(auto fileInfo, dir.entryInfoList(QDir::Files)) {
        fileInfo.refresh(); // 强制刷新所有文件属性
        int daysDiff = fileInfo.birthTime().date().daysTo(today);
        // 后续业务逻辑
    }
    
  2. 预加载时间属性
    调用entryInfoList()时添加QDir::FileTime标志,让QT提前加载时间相关属性:

    auto fileInfos = dir.entryInfoList(QDir::Files | QDir::FileTime);
    
  3. 平台针对性处理

    • Windows平台:如果仍无法读取,可尝试直接调用Windows原生API(如GetFileTime)获取创建时间。
    • Linux平台:检查文件系统挂载参数是否开启创建时间记录(ext4需添加inode64,user_xattr),若业务允许,也可以用lastModified()作为替代方案。
  4. 校验时间有效性
    先判断创建时间是否有效,避免处理无效数据:

    QDateTime birthTime = fileInfo.birthTime();
    if (birthTime.isValid()) {
        int daysDiff = birthTime.date().daysTo(today);
        // 处理逻辑
    } else {
        qDebug() << "无法读取文件创建时间:" << fileInfo.fileName();
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:33:14