繁体   English   中英

将ISO时间转换为std :: chrono :: time_point

[英]Converting ISO time to std::chrono::time_point

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

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

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

        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而不是本地时间。

我发现了问题并发布了解决方案:

struct tm基于自1900年以来的年份,因此该行:

timeDate.tm_year = std::stoi(isoString.substr(0, 4));

应该:

timeDate.tm_year = std::stoi(isoString.substr(0, 4)) - 1900;

此外, struct tm应在使用前清除:

struct tm timeDate
memset(&timeDate, 0, sizeof(timeDate));

这解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM