通常您可以使用强制转换将操作数转换为您知道正确格式的某种类型。
您提出的解决方案:
time_t t = time(NULL);
printf("%s", t);
显然不会工作,因为time_t 是数字类型,而不是char*。
一般来说,我们知道time_t 是一种算术类型。像这样的:
printf("%ld\n", (long)t);
可能适用于大多数系统。 (a) 如果time_t 是不大于unsigned long 的无符号类型并且t 的当前值超过LONG_MAX,或者(b) 如果time_t 是浮点类型,它可能会失败。
如果你有C99支持,可以使用long long,这样会好一点:
printf("%lld\n", (long long)t);
如果你真的想在便携性上过火,你可以检测time_t是什么类型:
if ((time_t)-1 > 0) {
// time_t is an unsigned type
printf("%ju\n", (uintmax_t)t);
}
else if ((time_t)1 / 2 > 0) {
// time_t is a signed integer type
printf("%jd\n", (intmax_t)t);
}
else {
// time_t is a floating-point type (I've never seen this)
printf("%Lg\n", (long double)t);
}
您可能希望将%Lg 格式调整为%Lf 或%.10Lf,具体取决于您想要的输出格式。
同样,这假设 C99 支持 - 您需要 #include <stdint.h> 才能使 uintmax_t 和 intmax_t 可见。
time_t 和 clock_t 有点不寻常,因为标准规定仅它们是能够表示时间的算术类型。 (原则上它们可能是复杂类型,但我会说忽略这种可能性是值得冒险的。)
在大多数其他情况下,您可能会知道给定类型是有符号、无符号还是浮点,并且您可以转换为该类型中最宽的类型。
请注意,如果您不知道time_t 是如何表示的,那么您可能也不会理解printf(例如1379375215)的输出——除非您的目标是弄清楚这一点。
(如果您使用 C++ 而不是 C 进行编程,std::cout << t << "\n"; 将自动使用正确的重载 operator<<。)
如果您想要人类可读的输出(例如Mon 2013-09-16 16:46:55 PDT),您需要使用<time.h> 中声明的转换函数之一,例如asctime() 或strftime() .