【问题标题】:calendar time stored as a signed 32-bit integer - when will it overflow日历时间存储为带符号的 32 位整数 - 何时溢出
【发布时间】:2017-06-11 13:52:43
【问题描述】:

我正在做Unix Advanced Programming中的练习,遇到了以下问题:

如果日历时间存储为带符号的 32 位整数,在哪一年会溢出?

正符号整数 = 2147483647

在以下计算中,我没有考虑闰年:

((((2147483647 / 60sec) /60min)/24)/365) = 68.1yrs

这是一种幼稚的方法。我该如何专业地解决这个问题?

堆栈成员之前提出的以下解决方案对于打印年份非常有帮助。

int epoch_time = INT_MAX;
struct tm * timeinfo;
time_t epoch_time_as_time_t = epoch_time;
timeinfo = localtime(&epoch_time_as_time_t);
printf("2] overflow date: %s", asctime(timeinfo));

【问题讨论】:

  • 对我来说你的方法是正确的。
  • @MichaelWalz 这并不完全正确,因为它每年使用 365 天,实际上这个数字是 365.242...
  • 你是在假设一个特定的时代吗?有标准的 unix 纪元,但如果需要,您可以使用其他纪元。
  • 这被称为Year 2038 Problem。我有一个完整的讨论,叫做REPENT, FOR THE END OF THE UNIX EPOCH IS NIGH! (为糟糕的音频道歉)
  • @M.M 我写了方法是正确的,OP 说他没有考虑闰年。

标签: c unix time-t year2038


【解决方案1】:

什么时候溢出

假设在有问题的平台上 int 是 32 位宽(并且 time_tintegral 类型,例如会说它不是 struct),就这样做

printf("%s\n", asctime(localtime(&(time_t){difftime(INT_MAX, 0)})));

你知道的。

打印出来:

Tue Jan 19 04:14:07 2038

将参数交换为difftime() 可以得到“最早”的日期,顺便说一句:

printf("%s\n", asctime(localtime(&(time_t){difftime(0, INT_MAX)})));

打印

Fri Dec 13 21:45:53 1901

【讨论】:

    【解决方案2】:

    一种方法是使用 UNIX date 命令。具体来说,date -d '@<seconds>' 将输出与自 UNIX 纪元以来的<seconds> 秒对应的日期和时间。此外,如果您只关心年份,可以提供格式说明符 +%Y

    所以,对于这个例子,你将执行

    date -d '@2147483647' +%Y
    

    会看到输出2038

    【讨论】:

    • 时代是 1970 年 1 月 1 日,所以如果我将计算结果相加,溢出日期将是 2038 年。
    【解决方案3】:

    这种方法可能看起来很幼稚,但几乎是准确的。您需要考虑闰年和闰秒。

    UNIX 时间的维基百科页面在某处提到了 2038 年。在那里您可以找到其余的详细信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2010-10-12
      • 1970-01-01
      • 2011-03-15
      • 2021-09-22
      • 2020-03-27
      相关资源
      最近更新 更多