将 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 上它没有正确转换 - 对于我输入的每一次字符串,剩余的结果是不正确的。我不知道我做错了什么:
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 而不是本地时间。
我找到了问题并 post 解决方案:
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));
问题解决了。
我有以下函数可以将 ISO 类型字符串转换为 std::chrono::time_point
格式,精度为毫秒。该代码在 Linux 上始终运行良好,但现在我需要将其转换为 Windows。
为了使用相同的代码,我使用 _WIN32
标志为 Windows 编译了它,并更改了我正在使用的编译器 VS2010 不支持的 strptime
代码。
在 windows 上它没有正确转换 - 对于我输入的每一次字符串,剩余的结果是不正确的。我不知道我做错了什么:
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 而不是本地时间。
我找到了问题并 post 解决方案:
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));
问题解决了。