c++ - 将 ISO 时间转换为 std::chrono::time_point

标签 c++ c++-chrono

我有以下函数将 ISO 类型字符串转换为具有毫秒精度的 std::chrono::time_point 格式。该代码在 Linux 上一直运行良好,但现在我需要将其转换为 Windows。

为了使用相同的代码,我使用 Windows 的 _WIN32 标志对其进行编译,并更改了我正在使用的编译器 VS2010 不支持的 strptime 代码。

在 Windows 上,它无法正确转换 - 对于每个单次字符串,我输入的剩余结果是不正确的。我无法找出我做错了什么:

        std::chrono::time_point<std::chrono::system_clock> convertISOStringToTimePoint(std::string isoString)
        {
            struct tm timeDate;

#ifdef _WIN32
            timeDate.tm_year = std::stoi(isoString.substr(0, 4));
            timeDate.tm_mon = std::stoi(isoString.substr(5, 2)) - 1;
            timeDate.tm_mday = std::stoi(isoString.substr(8, 2));
            timeDate.tm_hour = std::stoi(isoString.substr(11, 2));
            timeDate.tm_min = std::stoi(isoString.substr(14, 2));
            timeDate.tm_sec = std::stoi(isoString.substr(17, 2));
            timeDate.tm_isdst = -1;
#else
            strptime(isoString.c_str(), "%FT%TZ", &timeDate);
#endif
            time_t t = mktime(&timeDate);

            std::chrono::time_point<std::chrono::system_clock> time;
            time = std::chrono::system_clock::from_time_t(t);

            auto timeMs = std::chrono::time_point_cast<std::chrono::milliseconds>(time);

            int value = std::stoi(isoString.substr(20,3));

            timeMs += std::chrono::milliseconds(value);

            return timeMs;
        }

感谢帮助了解这里发生了什么......

最佳答案

由于 mktime 使用您当前的本地时区,我的通灵调试技巧告诉我,您给出的 ISO 时间戳可能是 UTC 而不是本地时间。

关于c++ - 将 ISO 时间转换为 std::chrono::time_point,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37057764/

相关文章:

c++ - 学习数据结构和算法作为入门水平的最佳书籍/网站/博客?

c++ - 让编译器将 << 视为为特定类定义的

c++ - 找出n个月前的确切日期和时间?

c++ - 保存和加载 std::chrono::time_point 到文件

c++ - 为什么 std::chrono 在测量 OpenMP 并行化 for 循环和编译器优化的执行时间时不起作用?

c++ - 极度 CPU 密集型闹钟

c++ - 如何在 c++ 中创建一个程序以在桌面上运行并在运行时从程序员指定的文件夹中使用位图?

c++ - 解析为 time_point 时的格式化时间字符串给出了一个小时的差异

C++ 使用 std::chrono 测量不正确的 FPS 和 deltaTime

c++ - 在 Gtk+ (gtkmm) 中连接关键加速器