2016-05-05 17 views
1

ISOタイプ文字列をミリ秒精度のstd::chrono::time_point形式に変換する次の関数があります。コードはLinux上では問題なく動作しましたが、今はWindowsに変換する必要があります。ISO時刻をstd :: chrono :: time_pointに変換する

同じコードを使用するには、Windows用に_WIN32フラグを付けてコンパイルし、VS2010でサポートされていないstrptimeコードを変更しました。コンパイラは私が使用しています。

ウィンドウ上では正しく変換されません.eveyの1回限りの文字列に対しては、残りの結果が正しく入力されません。私は私が間違っているのかを調べることができません。ここで起こってwhat'sを見つけるために感謝

 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; 
     } 

ヘルプ....

+1

Windowsでどのコンパイラを使用していますか? – NathanOliver

+0

あなたは曖昧です。あなたの[MCVE]を提示してください。 –

+0

Windowsの場合VS2010。 – Mendes

答えて

0

I'veは、問題を発見し、解決策ポスト:1900年

struct tm年に基づいていますが、そのライン:

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)); 

それが問題を解決しました。

3

mktimeがあなたの現在のローカルタイムゾーンを使用しているので、私の精神的なデバッグのスキルは教えてあなたが与えたISOタイムスタンプはおそらくローカルタイムではなく、UTCであると考えています。

関連する問題