如前所述,标准并未明确规定time_t是什么。如果您想以可移植的方式使用它,请先将其转换为long类型,然后再将其打印为long类型。这样,即使在2038年问题中,32位架构仍然可用,您的程序也不会受到影响 :-) ...
time_t t = time(NULL);
long lt = (t > 0) ? t : (unsigned int) t;
printf("%ld", lt);
对于time_t,它应该适用于32位有符号或无符号整数,或者64位整数。当time_t成为一个负的64位整数时,我的公式将会失效,但是在那个时候请与我联系,我应该足够聪明以找到更好的解决方案 :-)
编辑:
正如chux所指出的,如果int只有16位,这是不好的。这里有一种稳健但不太美观的方式。
union {
long l;
unsigned char[1] c;
} ul;
time_t t = time(NULL);
ul.l = 0;
ul.c[0] = 255;
if (ul.l < 0) {
ul.l = 0;
memcpy(&ul.l, t&, sizeof(time_t));
}
else {
ul.l = 0;
memcpy(&ul.l + sizeof(long) - sizeof(time_t), &t, sizeof(time_t));
}
printf("%lu", (unsigned long) ul.l);
只要 sizeof(long)>=sizeof(time_t)
,它应该在任何配置中正常工作。
编辑 2:
chux 的建议似乎适用于任何合理的情况。当然,在某些特殊情况下可能会出现问题,但在正常的实现中不会。
time_t t = time(NULL);
long lt = (t > 0) ? t : t * 1u;
printf("%ld", lt);
应该返回正确的结果。
tm
结构。 - MicroVirus