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

问题描述

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

我将其解析为 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 中获取的时间信息进行比较的最佳方法是什么?谢谢。

解决方法

只需使用 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++ 解析:

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() 在 3920 年超出范围时返回 -1 的原因。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...