将日期和时间字符串解析为数字以比较 C++

Posted

技术标签:

【中文标题】将日期和时间字符串解析为数字以比较 C++【英文标题】:Parsing date and time string into a number to compare C++ 【发布时间】:2021-03-29 09:56:06 【问题描述】:

我的应用程序收到一个日期和时间字符串。我需要能够解析这个字符串并将其与当前时间(以秒为单位)进行比较。

我将其解析为struct tm t,以分别获取年、月、日、小时、分钟和秒。

    std::string timestr = "2020-12-18T16:40:07";
    struct tm t = 0;

    sscanf(timestr.c_str(), "%04d-%02d-%02dT%02d:%02d:%02d",
           &t.tm_year, &t.tm_mon,  &t.tm_mday,
           &t.tm_hour, &t.tm_min, &t.tm_sec);

我不确定是否需要将其转换为纪元时间,但是当我这样做时,我得到 -1。我不知道为什么。

time_t t_of_day;
t_of_day = mktime(&t);

我真的需要先将其转换为纪元吗?

对我来说,获取当前时间(以秒为单位)然后将其与我在t 中获得的时间信息进行比较的最佳方法是什么?谢谢。

【问题讨论】:

该字符串是否代表 UTC 或某个本地时区?如果是时区,是哪个时区? 【参考方案1】:

你想要 C++ 解析:

https://en.cppreference.com/w/cpp/io/manip/get_time

std::stringstream timestr = "2020-12-18T16:40:07";
struct tm         t = 0;

timestr >> std::get_time(&t, "%Y-%m-%dT%H:%M:%S");

我应该注意到您的代码中有一个错误:tm_year 与我们所知道的年份不同。这是自 1900 年以来的年数!

https://www.cplusplus.com/reference/ctime/tm/

所以你的代码需要另外一行:

 t.tm_year -= 1900;

注意:std::get_time() 已经进行了补偿。

这可能是 mktime() 返回 -1 的原因,因为 3920 年超出范围。

【讨论】:

你确定 t.tm_year -= 1900;是必须的 ?即使没有减法,当我打印出来时,它也会为我显示 2020 年【参考方案2】:

只需使用chrono库的功能即可:

auto tp    = std::chrono::system_clock::from_time_t(std::mktime(&t));
auto epoch = std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch());

但您不需要将其转换为纪元。使用std::chrono::time_point比较像:

auto tp    = std::chrono::system_clock::from_time_t(std::mktime(&t));
auto now   = std::chrono::system_clock::now();

std::cout << (tp == now) << std::endl;

【讨论】:

以上是关于将日期和时间字符串解析为数字以比较 C++的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的日期/时间解析

如何比较日期和时间,以字符串格式给出?

C++ 日期解析实现

在 Windows C++ 中将字符串解析为日期的区域感知

Rails:如何将日期时间字符串解析为特定时区

在 Java 中以不同的格式将字符串解析为日期