将字符串转换为time_t,然后将time_t转换回字符串
问题描述:
我想将日期时间字符串保存到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;
}
答
夏令时(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);
tm_isdst的正值或0值应导致mktime()最初假设 夏令时分别在或不在 效应指定的时间。 tm_isdst的负值应为 会导致mktime()尝试确定夏令时 是否对指定时间有效。
时区问题?你在什么时区?夏令时?你有没有检查过'tm'结构的细节(例如在调试器中)? –
1小时的差距是有道理的...我没有得到的是1470年。 – pah
@JoachimPileborg它在同一台机器上。但如何使它独立于时区。 – Christophe