在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;

而且还必须从月数CCD_ 3中减去1。

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

这就解释了为什么在秒数上有很大的差异。

相关内容

  • 没有找到相关文章

最新更新