【发布时间】:2015-05-06 23:58:58
【问题描述】:
我有以下代码:
struct tm time;
strptime("27052010", "%d%m%Y", &time);
cout << "sec: " << time.tm_sec << "\n";
cout << "min: " << time.tm_min << "\n";
cout << "hour: " << time.tm_hour << "\n";
cout << "day: " << time.tm_mday << "\n";
cout << "month: " << (time.tm_mon + 1) << "\n";
cout << "year: " << time.tm_year << "\n";
time_t t = mktime(&time);
cout << "sec: " << time.tm_sec << "\n";
cout << "min: " << time.tm_min << "\n";
cout << "hour: " << time.tm_hour << "\n";
cout << "day: " << time.tm_mday << "\n";
cout << "month: " << (time.tm_mon + 1) << "\n";
cout << "year: " << time.tm_year << "\n";
cout << "time: " << t << "\n";
输出是:
sec: 1474116832
min: 32767
hour: 4238231
day: 27
month: 5
year: 110
sec: 52
min: 0
hour: 6
day: 2
month: 9
year: 640
time: 18008625652 (Fri, 02 Sep 2540 04:00:52 GMT)
我的问题是为什么mktime() 会更改time 的值,为什么转换后的time_t 不等于我输入的日期。我希望输出是自 1970 年以来以秒表示的日期 (27.05.2010 = 1330905600)。
提前致谢
【问题讨论】:
-
在调用
mktime之前time.tm_hour、time.tm_min和time.tm_sec的值是多少? -
@Wintermute 我添加了信息。
-
Err... 你拿了一个未初始化的结构体,从它的许多字段中初始化了三个,然后“转换”它(三个有意义的值加上很多垃圾),然后读回字段并想知道为什么你得到的主要是垃圾? ;-) GIGO,真的。
-
问题是小时、分钟和秒的值很高,对吗? mktime() 会将这些超出范围的值转换为下一个更高单位的值吗? (25 小时 -> 1 小时但 +1 天)。
-
在调用
strptime()之前清除time,否则其他字段中的随机值会被mktime()调整到正常范围并影响y、m、d。