【发布时间】:2015-07-13 02:40:29
【问题描述】:
我正在尝试以人类可读的格式打印出日期,以获得可能的最大 time_t 值。 以下代码在 32 位机器上似乎工作得很好(使用 0x7fffffff 初始化 m_time),但它在 64 位机器上为理论上的最高值输出 null。这是 ctime 限制还是我错过了什么?
编译:gcc -Wall -g3 main.c -o time_test
主机:x86_64。
#include <stdio.h>
#include <time.h>
#include <stddef.h>
int main(int argc, char** argv) {
time_t m_time = 0x7fffffffffffffff;
time_t current_time;
time(¤t_time);
printf("time_t info: sizeof [%ld] bytes or [%ld] bits.\n", sizeof(time_t), sizeof(time_t) *8 );
printf("m_time val: [%ld]-> %s\n", m_time, ctime(&m_time));
printf("current_time val: [%ld]-> %s\n", current_time, ctime(¤t_time));
return 0;
}
输出:
time_t info: sizeof [8] bytes or [64] bits.
m_time val: [9223372036854775807]-> (null)
current_time val: [1430678274]-> Sun May 3 15:37:54 2015
tks.
【问题讨论】:
-
"当遇到错误时,这些函数返回
NULL并将errno设置为适当的值。"perror说什么? -
确实有错误。错误:参数无效。
-
务实地说,如果
time_t有超过 40 位(例如 64 位),则您不关心最大可表示时间。您和阅读该论坛的每个人(以及我们所有的孙子)都将死去,运行您的程序的计算机将全部被破坏,那时 C 将不复存在。 Y2038 problem 实际上没有任何等效的 64 位。所以只是特例time_t是 32 位。 -
嗯,它可以报告未来 2920 亿年的日期。或者它可以假设周围不再有任何人来运行您的程序。你会怎么做?
-
我肯定会报告日期。当我们开始为时间旅行设备开发固件时,这将是一个问题。我什至可以看到,用户被抛到时空连续体之外。这将是一个非常令人头疼的问题。
标签: c 32bit-64bit ctime