我找到了该代码:
sort(filenames.begin(), filenames.end(), [](const string& a, const string& b)
{
auto GetDate = [](const string& s) -> time_t
{
std::string a = s.substr(s.find("trades") + 7, 10);
std::istringstream date_s(a);
struct tm date_c;
date_s >> std::get_time( &date_c, "%Y-%m-%d" );
std::time_t seconds = std::mktime( & date_c );
return seconds;
};
time_t partA = getEpochTime(a), partB = getEpochTime(b);
//time_t partA = GetDate(a), partB = GetDate(b);
cout << a << " " << partA << " " << partB << " " << b << endl;
return partA < partB;
});
我的文件名是具有这些值的向量:
./files/BTCUSDT-trades-2020-01-01.csv
./files/BTCUSDT-trades-2020-01-03.csv
./files/BTCUSDT-trades-2020-01-04.csv
./files/BTCUSDT-trades-2020-01-08.csv
./files/BTCUSDT-trades-2020-01-05.csv
./files/BTCUSDT-trades-2020-01-06.csv
./files/BTCUSDT-trades-2020-01-09.csv
./files/BTCUSDT-trades-2020-01-10.csv
正如你所看到的,排序后,它显然不起作用。由于某种原因,当在排序函数中打印 a 和 partA 时,我发现奇怪的值:
./files/BTCUSDT-trades-2020-01-09.csv 1578525308 1577834108 ./files/BTCUSDT-trades-2020-01-01.csv
./files/BTCUSDT-trades-2020-01-09.csv 1536583284 1578400884 ./files/BTCUSDT-trades-2020-01-07.csv
./files/BTCUSDT-trades-2020-01-09.csv 1578573684 1578660084 ./files/BTCUSDT-trades-2020-01-10.csv
./files/BTCUSDT-trades-2020-01-09.csv 1578573684 1578314484 ./files/BTCUSDT-trades-2020-01-06.csv
./files/BTCUSDT-trades-2020-01-02.csv -504396806053 1577834108 ./files/BTCUSDT-trades-2020-01-01.csv
知道我做错了什么吗?
简短的回答 - 不要使用任何时间转换,您可以简单地按字典顺序对字符串进行排序:
std::sort(filenames.begin(), filenames.end());
您未能正确初始化您的
std::tm
对象,因此它包含垃圾值。
std::mktime
的文档:
如果
对象是从std::tm
或 POSIXstd::get_time
获取的,则strptime
的值是不确定的,需要在调用tm_isdst
之前显式设置。mktime
std::get_time
的文档:
[...] 未指定此函数是否将
中未由*tmb
中出现的转换说明符直接设置的字段清零:可移植程序应在调用fmt
之前将*tmb
的每个字段初始化为零。std::get_time
您必须初始化
std::get_time
未设置的所有内容:
// ...
struct tm date_c;
date_c.tm_sec = 0;
date_c.tm_min = 0;
date_c.tm_hour = 0;
date_c.tm_isdst = 0;
date_s >> std::get_time( &date_c, "%Y-%m-%d" );
// ...