【问题标题】:Convert struct tm to time_t将 struct tm 转换为 time_t
【发布时间】: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_hourtime.tm_mintime.tm_sec的值是多少?
  • @Wintermute 我添加了信息。
  • Err... 你拿了一个未初始化的结构体,从它的许多字段中初始化了三个,然后“转换”它(三个有意义的值加上很多垃圾),然后读回字段并想知道为什么你得到的主要是垃圾? ;-) GIGO,真的。
  • 问题是小时、分钟和秒的值很高,对吗? mktime() 会将这些超出范围的值转换为下一个更高单位的值吗? (25 小时 -> 1 小时但 +1 天)。
  • 在调用strptime()之前清除time,否则其他字段中的随机值会被mktime()调整到正常范围并影响y、m、d。

标签: c++ time


【解决方案1】:

mktime 在转换为time_t 之前对其所有参数进行规范化。您有巨大的小时、分钟和秒值,因此它们都被转换为适当的天数,将值推到了遥远的未来。

在调用mktime 之前,您需要将tm 的其他重要属性(包括小时/分钟/秒)归零。如评论中所述,只需将其初始化为零:tm time = {0};(标记为 C++,因此不需要前导 struct)。进一步注意,您可能希望将 tm_isdst 设置为 -1,以便它尝试确定夏令时值,而不是假设不是 DST(如果初始化为零)。

【讨论】:

  • 有没有比手动设置所有值两个零更聪明的方法?抱歉,我对 C 不是很熟悉。
  • “将小时/分钟/秒归零”是不够的。除了 tm_yday, tm_wday 之外的所有字段都需要初始化,包括 tm_isdst 和潜在的其他字段,并且未定义总字段集,因此“对这些属性进行简单分配”。除非代码知道它们都是什么,否则可能不会初始化所有字段。
  • @aQuip struct tm time = {0};
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 2021-07-21
  • 2014-02-02
  • 2015-09-09
  • 2012-06-22
  • 2019-03-16
  • 2016-05-23
相关资源
最近更新 更多