gpt4 book ai didi

c++ - 解析为 time_point 时的格式化时间字符串给出了一个小时的差异

转载 作者:太空狗 更新时间:2023-10-29 22:55:36 26 4
gpt4 key购买 nike

我发现了以下问题。我有一个带时间的字符串(从我使用反向操作输出的文件中获取)。但是,当将其转换为 time_point 并将其输出到终端时,我发现相差一小时。我一直无法找出原因。有什么想法吗?

#include <iostream>
#include <chrono>
#include <sstream>
#include <iomanip>

const char *const TIME_FORMAT = "%Y-%b-%d %H:%M:%S";

int main() {
//Formatted timestring
std::string timeString = "2018-Jun-18 09:03:43,24";

//Logic to parce the string into a time struct
std::istringstream ss(timeString);
std::locale locale("");
ss.imbue(locale);
std::tm t = {};
ss >> std::get_time(&t, TIME_FORMAT);

if (ss.fail()) {
//TODO throw exception;
std::cout << "Parse failed\n";
}

//Convert to time_point
time_t time = mktime(&t);
auto time_point = std::chrono::system_clock::from_time_t(time);

//Convert to output string
auto time_t_again = std::chrono::system_clock::to_time_t(time_point);
std::cout << "timePoint: " << std::put_time(std::localtime(&time_t_again), TIME_FORMAT);
return 0;
}

此输出:timePoint: 2018-Jun-18 10:03:43 而不是预期的 2018-Jun-18 9:03:43

最佳答案

问题是mktime。它根据t.tm_isdst修改时间.在运行之前,您还需要在 struct tm 上运行 std::memset(解析器正在填充他们在格式中找到的内容)。

此时您可以有 2 个选择:

  1. 按照建议将 t.tm_isdst 设置为 -1,并根据解析的日期(处理时间为本地时间)自动进行夏令时更改,
  2. 使用timegm_mkgmtime并保持 t.tm_isdst 为 0 反对 mktime (处理时间为 UTC,simplify the code)。

关于c++ - 解析为 time_point 时的格式化时间字符串给出了一个小时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50904447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com