在C中打印时间(0)的格式说明符
我们可以使用以下方法声明一个变量来保存系统中的当前时间:在C中打印时间(0)的格式说明符,c,time,types,C,Time,Types,我们可以使用以下方法声明一个变量来保存系统中的当前时间: time_t now = time(0); 时间(0)也可用于生成随机值: #define SEED time(0); srand((unsigned int )SEED); 我的问题是:时间(0)到底是什么。默认情况下,它是否以毫秒为单位,类型为long?如果要打印时间(0)的值,是否可以使用%d”打印?(Sicneprintf()要求我们传入它所需的类型,但我如何知道时间(0)的类型?) 如果它是time\u t类型,我应该在pr
time_t now = time(0);
时间(0)
也可用于生成随机值:
#define SEED time(0);
srand((unsigned int )SEED);
我的问题是:时间(0)到底是什么。默认情况下,它是否以毫秒为单位,类型为long
?如果要打印时间(0)的值,是否可以使用%d”
打印?(Sicneprintf()
要求我们传入它所需的类型,但我如何知道时间(0)的类型?)
如果它是
time\u t
类型,我应该在printf中使用什么格式说明符?在大多数系统上,时间定义在与整数相同的位数上,并且总是正的
在这种情况下,您可以使用:
printf("time: %u", (unsigned int) time(0));
时间由C标准C11,7.27.1/3定义为: […]是能够表示时间的真实类型 这意味着它可以是int、long、unsignedlong、double或任何其他实数类型。基本上,这是实现的选择。类似地,它也没有定义什么单位
time\t
返回,C11,7.27.2.4/3:
时间函数返回实现的最佳近似值
到当前日历时间。返回值(time_t)(-1)
如果日历时间不可用。如果计时器不是空值
指针,返回值也被指定给它所指向的对象
您必须阅读您的实现说明。我在Linux上的glibc实现说,时间返回的单位是秒。因此,您可以将其转换为uintmax\t
并打印:
time_t tvalue = time(0);
printf("%ju", (uintmax_t)tvalue);
或者,您可以使用它返回一个
double
作为两个time\t
值之间的差值,这样您就不必担心time\t
的基本类型,正如前面所说的,标准并没有指定时间是什么。如果您想确保以便携方式使用它,请首先将其转换为long,然后将其打印为long。这样,即使32位体系结构在当时仍然可用,您的程序也不会遇到2038年的问题:-)
它应该适用于32位有符号insigned整数或64位整数的时间。当时间为负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) { /* endianness test */
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);
应该给出正确的结果。标准没有定义时间的类型;它只需要是能够表示时间的真实类型。它可以是整数类型或浮点类型(幸运的是,它不会很复杂)。它不一定是秒数,毫秒数,或任何简单的单位。原则上,它可以使用位的范围以二进制编码的十进制表示月、秒、日、小时、分钟和年。最常见的表示形式是32位或64位有符号整数,表示UTC 1970-01-01 00:00:00以来的秒数 如果您希望以完全便携的方式打印
time\t
值,您可以检测time\t
的类型:
#include <stdio.h>
#include <time.h>
#include <stdint.h>
int main(void) {
time_t now = time(NULL);
printf("At the sound of the tone, the time will be ... \a");
if ((time_t)1 / 2 != 0) {
// time_t is a floating-point type; convert to long double
printf("%Lf\n", (long double)now);
}
else if ((time_t)-1 > (time_t)0) {
// time_t is an unsigned integer type
printf("%ju\n", (uintmax_t)now);
}
else {
// time_t is a signed integer type
printf("%jd\n", (intmax_t)now);
}
}
打印(目前在我的系统上):
现在是2014-11-21 08:57:19太平洋标准时间
查看时间函数的头文件,
您将看到,该参数可以是NULL或time\t变量的地址两种情况之一
参数和返回值的time()函数结果都是自历元(当前为1970年1月1日00:00 am UTC)以来经过的时间(以秒为单位)。值的大小(在旧系统上)为4字节(32位)。使用最新的RTC(实时时钟)硬件,“可能”值为8字节(64位)。在任何情况下,以秒为单位的值都是从历元开始的
4字节的时间值将在2038年溢出,因此正在努力
1) 将时间值设置为更大的大小或大小
2) 将历元时间向前移动到2000年1月1日00:00 am。
(使用旧硬件时的临时修复)
将时间值更改为8字节是当前首选的方法
以下是谷歌的一段具体引述:
“在2038年1月19日03:14:08 UTC,Unix时间戳的32位版本将停止工作”以对报价的其余部分进行同相:32位值将溢出
处理时间的函数,如localtime()strottime()。etc和相关的结构(如tm)被设置为使用运行它们的系统从time()函数返回的内容
时间函数中的值的所有处理都应该使用可用函数,而不是处理原始值。请参阅本页还说明了如何处理返回值:它归结为需要使用函数将其转换为
tm
结构。请阅读和不要使用%d
来printf
一个unsigned int
,这是未定义的行为<代码>%u将是正确的。不正确time(0)
如果由于某种原因失败,则返回(time_t)-1
,标准仅规定time_t
是一种能够表示时间的算术类型。在我正在键入此注释的系统上,sizeof(int)=4
和sizeof(time\u t)==8
。如果time\u t
是整数类型,则printf
的行为定义良好。如果该值为负值或超过UINT_MAX
,则输出将不会是实际值,但会进行一致调整。如果time\u t
是浮点类型,且值为负或超过UINT\u MAX
,则转换行为未定义。为什么将t
转换为unsigned
而不是unsigned long
?@chux:因为至少在MSVC上,当我直接将负短转换为无符号长时
time_t t = time(NULL);
long lt = (t > 0) ? t : t * 1u;
printf("%ld", lt);
#include <stdio.h>
#include <time.h>
#include <stdint.h>
int main(void) {
time_t now = time(NULL);
printf("At the sound of the tone, the time will be ... \a");
if ((time_t)1 / 2 != 0) {
// time_t is a floating-point type; convert to long double
printf("%Lf\n", (long double)now);
}
else if ((time_t)-1 > (time_t)0) {
// time_t is an unsigned integer type
printf("%ju\n", (uintmax_t)now);
}
else {
// time_t is a signed integer type
printf("%jd\n", (intmax_t)now);
}
}
#include <stdio.h>
#include <time.h>
#include <stdint.h>
int main(void) {
time_t now = time(NULL);
char s[100];
strftime(s, sizeof s, "%F %H:%M:%S %Z", localtime(&now));
printf("The time is now %s\n", s);
}