Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中打印时间(0)的格式说明符_C_Time_Types - Fatal编程技术网

在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”
打印?(Sicne
printf()
要求我们传入它所需的类型,但我如何知道时间(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);
}