使用 C++ 将时间字符串转换为纪元(以毫秒为单位)

V_J*_*iji 2 c++ time epoch

我尝试将以下时间字符串转换为以毫秒为单位的纪元

“2022-09-25T10:07:41.000Z”

我尝试了以下代码,该代码仅输出以秒为单位的纪元时间(1661422061)如何获取以毫秒为单位的纪元时间。

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

int main()
{
    int tt;
    std::tm t = {};
    std::string timestamp = "2022-09-25T10:07:41.000Z";
    std::istringstream ss(timestamp);

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

Ted*_*gmo 5

您可以使用 C++20 功能std::chrono::parse/std::chrono::from_stream并将时间点设置为以毫秒为单位。

我在 MSVC 上关于此主题的错误报告中的修改示例使用from_stream

#include <chrono>
#include <iostream>
#include <locale>
#include <sstream>

int main() {
    std::setlocale(LC_ALL, "C");
    std::istringstream stream("2022-09-25T10:07:41.123456Z");

    std::chrono::sys_time<std::chrono::milliseconds> tTimePoint;
    std::chrono::from_stream(stream, "%Y-%m-%dT%H:%M:%S%Z", tTimePoint);

    std::cout << tTimePoint << '\n';
    
    auto since_epoch = tTimePoint.time_since_epoch();
    std::cout << since_epoch << '\n';                 // 1664100461123ms

    // or as                                             1664100461.123s
    std::chrono::duration<double> fsince_epoch = since_epoch;
    std::cout << std::fixed << std::setprecision(3) << fsince_epoch << '\n';
}
Run Code Online (Sandbox Code Playgroud)

演示


如果您无法使用 C++11 - C++17,您可以安装dateHoward Hinnant 提供的库。它是 C++20 中包含的内容的基础,因此如果您稍后升级到 C++20,将不会遇到太多问题。

#include "date/date.h"

#include <chrono>
#include <iostream>
#include <sstream>

int main() {
    std::istringstream stream("2022-09-25T10:07:41.123456Z");

    date::sys_time<std::chrono::milliseconds> tTimePoint;
    date::from_stream(stream, "%Y-%m-%dT%H:%M:%S%Z", tTimePoint);

    auto since_epoch = tTimePoint.time_since_epoch();

    // GMT: Sunday 25 September 2022 10:07:41.123
    std::cout << since_epoch.count() << '\n'; // prints 1664100461123
}
Run Code Online (Sandbox Code Playgroud)