关于C++将UTC日期字符串转本地时间常规解法的疑问
关于UTC时间解析的语义疑问
以下是一段常见的时间转换代码:
int main() { std::string strUTCTime = "2017-03-17T13:20:00Z"; std::wstring wstrUTCTime = std::wstring(strUTCTime.begin(),strUTCTime.end()); time_t utctime = getEpochTime(wstrUTCTime.c_str()); struct tm tm; /*Convert UTC TIME To Local TIme*/ localtime_s(&tm, &utctime); char CharLocalTimeofUTCTime[30]; strftime(CharLocalTimeofUTCTime, 30, "%Y-%m-%dT%H:%M:%SZ", &tm); string strLocalTimeofUTCTime(CharLocalTimeofUTCTime); std::cout << "\nLocal To UTC Time Conversion:::" << strLocalTimeofUTCTime; } std::time_t getEpochTime(const std::wstring& dateTime) { /* Standard UTC Format*/ static const std::wstring dateTimeFormat{ L"%Y-%m-%dT%H:%M:%SZ" }; std::wistringstream ss{ dateTime }; std::tm dt; ss >> std::get_time(&dt, dateTimeFormat.c_str()); // (1) /* Convert the tm structure to time_t value and return Epoch. */ return _mkgmtime(&dt); }
针对代码中标注(1)的行,我的理解如下:
stringstream默认关联的是机器对应的本地locale;get_time会根据流的locale解析输入,即它会将被解析的字符串视为本地日历下的时间点,但实际上该字符串是UTC时区的UTC时间!
这种将UTC日期当作本地日期解析的做法是否存在语义问题?我无法理解这种“逻辑矛盾”是如何被解决的。
注: 请勿推荐替代方案(这并非我的问题),我仅能使用C++17及以下版本,还可使用POSIX或Linux专属函数(gcc 8.5,Linux内核3.x)。
内容的提问来源于stack exchange,提问作者ABu
相关产品推荐
相关产品推荐

