2016-08-05 135 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年之前通過的任何一年(或在您的時區採用DST之前的一年)都會影響小時。

此外,在回答對 「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

tm_isdst的正值或0值應導致mktime()最初假設 夏令時分別在或不在 效應指定的時間。 tm_isdst的負值應爲 會導致mktime()嘗試確定夏令時 是否對指定時間有效。

+0

根據[本答案](http://stackoverflow.com/a/12115059/238902)'-1'被解釋爲「未知」,可能是不可預測的。它不應該是'1'嗎? – Default

+0

@默認我會檢查標準。堅持... – pah

+1

@默認查看更新:) – pah