C++字符串日期向量排序异常问题求助
问题分析与修复
核心错误原因
未初始化
struct tm结构体
你定义的struct tm date_c没有做初始化,其中tm_hour、tm_min、tm_sec、tm_isdst等成员会残留随机垃圾值。mktime会使用这些随机值计算时间戳,导致同一日期生成不同的epoch值,甚至因为时间无效返回-1(表现为负数)。未检查日期解析的有效性
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
相关产品推荐
相关产品推荐

