在 C++ 问题中将时间字符串转换为秒

问题描述

我正在运行嵌入式 Linux 的嵌入式 ARM 设备上编写 C++ 应用程序。

我正在尝试将日期和时间字符串转换为秒,从当前时间(以秒为单位)中减去它,如果经过的秒数大于某个数字,则采取措施。

事实证明,实施起来应该非常简单的事情非常棘手,我不知道为什么。

我计算的时间差结果是一个很大的数字,而实际上它应该是一个很小的数字。看我下面的代码。我正在手动硬编码时间和日期字符串以进行测试。

std::string       timestr = "2020-12-21T16:07:00";
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);

t.tm_year -= 1900;   // This is required because my year should be the number of years since 1900

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

auto Now_s = std::chrono::time_point_cast<std::chrono::seconds>(Now);
auto tp_s = std::chrono::time_point_cast<std::chrono::seconds>(tp);

std::chrono::duration<double> diff = Now-tp;  // Huge number

auto elapsed = Now_s - tp_s;   // This value is massive and not as expected when printed out

解决方法

对于那些有兴趣的人,我解决了这个问题。

我们不仅应该从调用 std::mktime(&t) 之前的年数中减去 1900。

t.tm_year -= 1900;

而且还必须从月数 t.tm_mon -= 1 中减去 1。

月份的编号是从 0 到 11,而不是我们预期的 1 到 12。

这就解释了为什么在几秒钟内有很大的不同。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...