2016-08-05 141 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