2016-08-05 22 views
2

Я хочу сохранить строку времени даты в time_t, а затем преобразовать ее обратно в точно оригинальную строку.преобразовать строку в time_t, а затем преобразовать time_t в строку

Но ниже код будет выводить "2016-04-25_10:10:05"

И час на выходе будет неверным путем изменения date_str.

Если вы измените код на std::string date_str = "1470-04-25_09:10:05";, , результат будет исправлен.

Вот код:

#include <iostream> 
#include <ctime> 
#include <string> 
#include <sstream> 
#include <iomanip> 

int main() 
{ 
    // try changing year, hour will be incorrect 
    std::string date_str = "2016-04-25_09:10:05"; 

    std::tm tm{}; 
    std::istringstream str_stream(date_str); 
    str_stream >> std::get_time(&tm, "%Y-%m-%d_%T"); 
    std::time_t time = std::mktime(&tm); 

    std::stringstream stream; 
    stream << std::put_time(std::localtime(&time), "%F_%T"); 
    std::cout << stream.str() << std::endl; 
} 
+3

Проблемы с часовым поясом? В каком часовом поясе вы находитесь? Летнее время? Вы проверили структуру 'tm' для получения подробной информации (например, отладчика)? –

+0

1 час пробел имеет смысл ... то, что я не получаю, это год 1470. – pah

+0

@JoachimPileborg Он находится на одной машине. Но как сделать его часовым поясом независимым. – Christophe

ответ

2

Переход на летнее время (DST) используется для экономии энергии и лучше использовать дневного света. Он был впервые использован в 1908 году в Тандер-Бей, Канада.

Это объясняет, почему любой год, который вы проходите до 1908 года (или до года, на который был установлен часовой пояс), повлияет на час.

Кроме того, отвечая на один час щели на "2016-04-25_10:10:05" случае, это происходит потому, что вы не устанавливая tm.tm_isdst до mktime() вызова:

/* Assuming that all tm memory is set to 0 prior to this */ 
tm.tm_isdst = -1; /* mktime() will figure out the DST */ 
std::time_t time = std::mktime(&tm); 

По словам POSIX-1003.1-2001:

Положительное значение или значение 0 для tm_isdst должно приводить к тому, что mktime() предположим, что изначально, что переход на летнее время соответствует или не соответствует эффекту за указанное время. Отрицательное значение для tm_isdst должно вызвать mktime(), чтобы попытаться определить, действует ли дневное время в течение указанного времени.

+0

в соответствии с [этот ответ] (http://stackoverflow.com/a/12115059/238902) '-1' интерпретируется как «неизвестно» и может быть непредсказуемым. Разве это не должно быть «1»? – Default

+0

@Default Я проверю стандарт. Удерживайте ... – pah

+1

@Default Смотрите обновление :) – pah

Смежные вопросы