C++ 中日期字符串的排序向量

问题描述 投票:0回答:1

我找到了该代码:

  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
  1. 某些日期给出负值
  2. 相同的日期(例如 2020-01-09)给出不同的值(1578525308、1536583284)。

知道我做错了什么吗?

c++ date
1个回答
0
投票

简短的回答 - 不要使用任何时间转换,您可以简单地按字典顺序对字符串进行排序:

std::sort(filenames.begin(), filenames.end());

您未能正确初始化您的

std::tm
对象,因此它包含垃圾值。

来自

std::mktime
的文档:

如果

std::tm
对象是从
std::get_time
或 POSIX
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" );
// ...
© www.soinside.com 2019 - 2024. All rights reserved.