簡體   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