從來就寫了下面的函數接收的時間點,並返回與毫秒的ISO字符串:localtime_s和strftime使用建築物ISO時間字符串
std::string TimePointToISOString(const std::chrono::time_point<std::chrono::system_clock>& time)
{
std::time_t rawTime = std::chrono::system_clock::to_time_t(time);
struct tm timeinfo;
localtime_s(&timeinfo, &rawTime);
std::chrono::milliseconds ms = std::chrono::duration_cast<std::chrono::milliseconds>(time.time_since_epoch());
std::size_t frac_seconds = ms.count() % 1000;
char buffer[32];
std::strftime(buffer, 32, "%FT%TZ", &timeinfo);
std::string bufferStr(buffer);
std::stringstream ss;
ss << bufferStr.substr(0, 19) << "." << std::setw(3) << std::setfill ('0') << frac_seconds << bufferStr.substr(20);
return ss.str();
}
從來就使用在Linux上運行,與localtime()
功能完全沒有問題。現在我正在遷移到Windows/VS2012,編譯器建議更改localtime()
以獲得更安全的localtime_s()
,立即完成。
轉換的strftime
調用不會在運行時崩潰,出現以下錯誤後:
Expression: ("Invalid format directive", 0)
編譯運行正常。幫助感謝您瞭解這裏發生了什麼。我想簡單的是我不會注意到...
傑裏,從來就試過'SS <<的std :: put_time(timeinfo, 「FT%TZ%」) ;'也沒有成功......同樣的錯誤......在VS2012中完全不支持'%FT'和'%TZ'。所以我改成了'「%Y-%m-%dT%H:%M:%SZ」並且正在使用'strftime'和std :: put_time。感謝您的幫助。 – Mendes
@Mendes:是的,我想'put_time'只不過是'strftime'的一個包裝器(或者兩者都使用相同的引擎),所以對於任何給定的編譯器,這兩個可能支持相同的轉換 - 在它們之間切換純粹是一個方便的問題,不太可能影響您的原始問題。 –