Отформатированная временная строка при разборе на time_point дает разницу в часах

Я нашел следующую проблему. У меня есть строка со временем (получена из файла, в который я поместил, используя обратные операции). Однако при преобразовании этого значения в 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 ответ

Проблема в mktime, Это изменяет время на основе t.tm_isdst, Вы также должны запустить std::memset на struct tm перед запуском (парсеры заполняют то, что нашли в формате).

С этого момента вы можете иметь 2 варианта:

  1. задавать t.tm_isdst до -1 в соответствии с предложением, и изменения дневного света производятся автоматически на основе проанализированной даты (время обработки соответствует местному времени),
  2. использование timegm или же _mkgmtime и хранить t.tm_isdst как 0 против mktime (обработка времени в формате UTC, упрощение кода).
Другие вопросы по тегам