【问题标题】:Converting human time to epoch Unix time returning negative number将人类时间转换为纪元 Unix 时间返回负数
【发布时间】:2012-10-14 09:25:39
【问题描述】:

我目前正在编写一些 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的输出。

感谢您提供的任何帮助。

【问题讨论】:

  • 为什么要减去 1970?只有 1900-2038 年可用,距离 42 年还很远
  • 所以我应该减去 1900,我认为时间戳是从 1970 年 1 月 1 日开始

标签: c mktime time-t


【解决方案1】:

2012 - 1970 计算为 42。而 1942 年在 1970 年 1 月 1 日之前。不过,mktime() 产生负时间戳是正常的。

来自 mktime 手册页:

tm_year   The number of years since 1900.

将你的年份计算改为2012 - 1900,你应该没问题。

【讨论】:

  • 当我想获得 1905 年的时间戳时它不起作用。 t.tm_year = 1905-1900;知道如何解决这个问题吗?
【解决方案2】:

请在来这里之前阅读手册页:

来自man mktime()的逐字记录:

tm结构的成员有:

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

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

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

tm_mday 月份中的第几天,范围为 1 到 31。

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

tm_year 自 1900 年以来的年数。

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-01-13
      • 2020-09-29
      • 2017-04-06
      • 1970-01-01
      • 2012-08-16
      • 2012-01-30
      • 2015-12-22
      • 2015-07-08
      • 2023-04-09
      相关资源
      最近更新 更多