mktime() 返回大量秒数

mktime() returning a huge amount of seconds

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

为什么不只是 1550793600 秒?

time_t 值不是可移植的吗?


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

(gdb) p ltm
 = {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}

在二进制中 18446744072104596016 是 1111111111111111111111111111111110100000010101100101001000110000 具有 64 位

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

给出

tm_year = 19

如果您希望输入代表 2019 年,那么您使用的 mktime() 是错误的。

根据 C 标准的 7.27.1 Components of time, paragraph 4

The tm structure shall contain at least the following members, in any order. The semantics of the members and their normal ranges are expressed in the comments.

     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 unsigned。