将字符串转换为time_t,然后将time_t转换回字符串

时间:2016-08-05 02:29:04

标签: c++ string 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;
}

1 个答案:

答案 0 :(得分: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()尝试确定是否夏令时   在指定时间内有效。