Как преобразовать строку формата %Y%m%d в переменную time_t в C++?

Я пытаюсь преобразовать строки в переменные time_t. Вот код, который я пробовал:

#include "pch.h"
#include <ctime>
#include <iomanip>
#include <iostream>
#include <sstream>

using namespace std;

time_t String_to_timet1(string endDate) {
    tm tm = { 0 };
    stringstream ss(endDate);
    ss >> get_time(&tm, "%Y-%m-%d %H:%M:%S");
    time_t epoch = mktime(&tm);

    return epoch;
}

time_t String_to_timet2(string endDate) {
    tm tm = { 0 };
    stringstream ss(endDate);
    ss >> get_time(&tm, "%Y%m%d");
    time_t epoch = mktime(&tm);

    return epoch;
}

int main()
{
    time_t time_certainTime1 = String_to_timet1("2019-01-01 00:00:00");
    cout << time_certainTime1 << endl;

    time_t time_certainTime2 = String_to_timet2("20190101");
    cout << time_certainTime2 << endl;

    return 0;
}

Я ожидал, что результаты будут такими же, но когда я запускаю код в Visual Studio 2017, результаты следующие:

1546268400
-1

и когда я запускаю тот же код на https://www.onlinegdb.com/online_c++_compiler, результаты:

1546300800
1546300800

Вопрос: Почему Visual Studio дает мне -1, когда она получает типизированную строку "%Y%m%d" (когда онлайн-компилятор дает мне ожидаемый результат)? Как сделать переменную time_t в таком формате?


person maynull    schedule 13.12.2019    source источник
comment
mktime() возвращает -1, если tm не может быть представлено как time_t. Вы не выполняете проверку ошибок, чтобы убедиться, что std::get_time() выполнено успешно.   -  person Remy Lebeau    schedule 13.12.2019
comment
Несвязанный: C++20 имеет несколько новых инструментов для решения этой проблемы. Если вам не терпится, вот прототип грядущих дополнений Говарда Хиннанта.   -  person user4581301    schedule 13.12.2019


Ответы (1)


В документации как для %m, так и для %d указано, что ведущие нули разрешены, но не обязательны. Это означает, что на самом деле не указано, будет ли он работать без разделителей или нет.

person sp2danny    schedule 13.12.2019