【问题标题】:mktime() returning a huge amount of secondsmktime() 返回大量秒数
【发布时间】:2019-02-22 18:39:21
【问题描述】:

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

为什么不只是 1550793600 秒?

time_t 值不是可移植的吗?


在 gdb 控制台中打印出的tm struct 在调用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}

【问题讨论】:

  • 您如何获取并打印time_t 值?
  • 发布显示mktime()返回如此巨大值的实际代码。
  • tm_year = 19 那是 1919 年,它返回一个很大的负数。
  • @KamilCuk 你成功了!这回答了一切!今年的争论超出了预期,我没有意识到它超出了预期的范围。
  • @KamilCuk tm_year = 19 那是 1919 年,它返回一个很大的负数。 确实。我花了一段时间确认 1919 年 2 月 22 日的 Unix 日期实际上是 18446744072104596016,如果 64 位 time_t 被视为无符号值。

标签: c unix mktime


【解决方案1】:

给定

tm_year = 19

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

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

tm 结构应至少包含以下成员,在任何 命令。成员的语义及其正常范围是 用 cmets 表示。

     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 未签名。

【讨论】:

  • 我也有太多秒但原因是高字节是0x49FB。为什么? tm tm; strptime(日期, "%a, %d %b %Y %H:%M:%S", &tm); type_t respDate = mktime(&tm); // type_t is long long ESP_LOGI(TAG, "xxx %s, %d, 0x%llX, %lld", date, tm.tm_year, respDate >> 32, respDate & 0xFFFFFFFF); //I (15448) app: xxx Thu, 04 Nov 2021 15:52:34 GMT, 121, 0x49FB, 1636041154
【解决方案2】:

二进制 18446744072104596016 是 1111111111111111111111111111111110100000010101100101001000110000 有 64 位

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

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 2016-10-09
    • 2015-02-05
    • 2023-03-27
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多