mktime()返回大量秒

时间:2019-02-22 18:39:22

标签: c unix mktime

在一个简单的测试中,从Unix纪元(01/01/1970 00:00:00 UTC)到2019年2月22日为止的经过时间以秒为单位,它返回了大量 18446744072104596016 strong>

为什么不只 1550793600 秒?

time_t值不是可移植的吗?


在调用tm struct之前,在gdb控制台中打印出的mktime()具有以下值:

(gdb) p ltm
$4 = {tm_sec = 0, tm_min = 0, tm_hour = 0, tm_mday = 22, tm_mon = 1, tm_year = 19, tm_wday = 0, tm_yday = 0, tm_isdst = 0}

2 个答案:

答案 0 :(得分:3)

给予

tm_year = 19

如果您期望该输入代表2019年,则您错误地使用了mktime()

按照C标准的7.27.1 Components of time, paragraph 4

  

tm结构至少应包含以下成员   订购。成员的语义及其正常范围是   在评论中表达。

     int    tm_sec;           //   seconds after the minute -- [0, 60]
     int    tm_min;           //   minutes after the hour -- [0, 59]
     int    tm_hour;          //   hours since midnight -- [0, 23]
     int    tm_mday;          //   day of the month -- [1, 31]
     int    tm_mon;           //   months since January -- [0, 11]
     int    tm_year;          //   years since 1900
     int    tm_wday;          //   days since Sunday -- [0, 6]
     int    tm_yday;          //   days since January 1 -- [0, 365]
     int    tm_isdst;         //   Daylight Saving Time flag

请注意,tm_year的值以自1900年以来的年份表示

您可能会在1919年2月22日获得time_t值,即-1604966400或18446744072104596016未签名。

答案 1 :(得分:1)

在二进制18446744072104596016中是具有64位的11111111111111111111111111111111101000000101011001010010001000110000

可能您将负值-1604955598用作无符号数字