解析为time_point时格式化的时间轴给出了小时差异

时间:2018-06-18 07:23:03

标签: c++ c++11 chrono ctime

我发现了以下问题。我有一个带时间的字符串(从我使用反向操作输入的文件中获取)。但是,当将其转换为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

1 个答案:

答案 0 :(得分:1)

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

此时,您可以有2个选择:

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