将人类时间转换为时代Unix时间返回负数

时间:2012-10-24 10:37:53

标签: c mktime time-t

我目前正在研究一些C代码,我正在尝试将人类可读日期转换为纪元时间戳(unix时间戳)。但是,它总是返回一个负数。我正在使用struct tm并对日期值进行硬编码,直到我正常工作。以下是代码

struct tm t;
time_t t_of_day;
t.tm_year = 2012 - 1970;
t.tm_mon = 9;
t.tm_mday = 24;
t.tm_hour = 11;
t.tm_min = 34;
t.tm_sec = 30;
t.tm_isdst = 1;
t_of_day = mktime(&t);
printf("Epoch time stamp is: %ld\n", t_of_day);

当此代码执行时,我得到-858000330的输出。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:7)

2012 - 1970计算到42.而1942年是在1970年1月1日之前。 mktime()导致负时间戳,这是正常的。

来自mktime手册页:

tm_year   The number of years since 1900.

将您的年度计算更改为2012 - 1900,您应该没问题。

答案 1 :(得分:2)

请在阅读之前阅读手册页:

man mktime()逐字逐句

  

tm结构的成员是:

     

tm_sec分钟后的秒数,通常在0到59的范围内,但最多可以为60,以允许闰秒。

     

tm_min小时后的分钟数,范围为0到59.

     

tm_hour午夜过后的小时数,范围为0到23。

     

tm_mday月份的日期,范围为1到31。

     

tm_mon自1月以来的月数,范围为0到11。

     

tm_year自1900年以来的年数。

     

tm_wday自星期日以来的天数,范围为0到6。

     

tm_yday自1月1日以来的天数,范围为0到365.

     

tm_isdst一个标志,指示夏令时是否在所描述的时间生效。如果夏令时有效,则该值为正,如果不是,则为零;如果信息不可用,则为负。

答案 2 :(得分:2)

tm_year是自1900年以来的年数,而不是1970年。