C++将时间字符串转换为纪元的秒数

Mar*_*ork 11 c c++ time platform-independent

我有一个字符串,格式如下:

2010-11-04T23:23:01Z

Z表示时间是UTC.
我宁愿将其存储为一个时间点,以便比较容易.

这样做的推荐方法是什么?

目前(在quck搜索之后),简化算法是:

1: <Convert string to struct_tm: by manually parsing string>
2: Use mktime() to convert struct_tm to epoch time.

// Problem here is that mktime uses local time not UTC time.
Run Code Online (Sandbox Code Playgroud)

Mar*_*ork 9

使用C++ 11功能,我们现在可以使用流来解析时间:

iomanip std::get_time将根据一组格式参数转换字符串并将其转换为struct tz对象.

然后,您可以使用std::mktime()它将其转换为纪元值.

#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>

int main()
{
    std::tm t = {};
    std::istringstream ss("2010-11-04T23:23:01Z");

    if (ss >> std::get_time(&t, "%Y-%m-%dT%H:%M:%S"))
    {
        std::cout << std::put_time(&t, "%c") << "\n"
                  << std::mktime(&t) << "\n";
    }
    else
    {
        std::cout << "Parse failed\n";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 这段代码没有解决OP问题(我不知道他为什么接受它)。`std::mktime` 假定本地时区并输出错误的时间。它在我的机器上给出了“1288909381”(该日期的“GMT+01:00”),这是“晚上 10 点”,而不是 UTC 的“晚上 11 点”。然而,正确的时间戳应该是“1288912981”。 (3认同)

Kir*_*sky 6

这是ISO8601格式.您可以使用strptime函数来使用%FT%T%z参数对其进行解析.这不是C++标准的一部分,但你可以使用它的开源实现(,例如).


Jus*_*ier 5

您可以使用strptime等函数将字符串转换为 a struct tm,而不是手动解析它。