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

C++字符串日期向量排序异常问题求助

问题分析与修复

核心错误原因

  1. 未初始化struct tm结构体
    你定义的struct tm date_c没有做初始化,其中tm_hour、tm_min、tm_sec、tm_isdst等成员会残留随机垃圾值。mktime会使用这些随机值计算时间戳,导致同一日期生成不同的epoch值,甚至因为时间无效返回-1(表现为负数)。

  2. 未检查日期解析的有效性
    std::get_time解析失败时不会主动报错,后续mktime处理无效的tm结构体,就会返回错误的时间戳(比如-1)。

修复后的代码

sort(filenames.begin(), filenames.end(), [](const string& a, const string& b)
{
    auto getEpochTime = [](const string& s) -> time_t
    {
        size_t tradesPos = s.find("trades");
        if (tradesPos == string::npos) {
            // 处理找不到"trades"的异常情况,可根据需求调整返回值
            return -1;
        }
        std::string dateStr = s.substr(tradesPos + 7, 10);
        std::istringstream date_s(dateStr);
        struct tm date_c = {}; // 初始化结构体,所有成员置0
        date_s >> std::get_time(&date_c, "%Y-%m-%d");

        // 检查日期解析是否成功
        if (date_s.fail()) {
            return -1;
        }

        // 显式设置非夏令时,避免系统自动推断的不确定性
        date_c.tm_isdst = 0;
        std::time_t seconds = std::mktime(&date_c);
        return seconds;
    };

    time_t partA = getEpochTime(a), partB = getEpochTime(b);
    cout << a << " " << partA << " " << partB << " " << b << endl;
    return partA < partB;
});

关键修复点说明

  • 初始化struct tm:用struct tm date_c = {};将所有成员初始化为0,确保时间部分(时/分/秒)统一为0,同一日期会生成完全一致的epoch值。
  • 添加错误检查:检查s.find("trades")的结果,避免找不到目标字符串时的越界操作;检查date_s.fail()确保日期解析成功,防止无效日期导致错误时间戳。
  • 显式设置tm_isdst:设置为0表示非夏令时,避免系统自动推断夏令时带来的时间戳偏差,保证同一日期的转换结果稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:02:48