如何以人类可读的形式打印无符号整数时间?

时间:2015-03-11 20:20:41

标签: c integer unsigned localtime

我有一个rawtime无符号整数,我尝试用一​​些人类可读的形式打印它

uint32_t rawtime=3675431915;
struct tm * timeinfo;
timeinfo = localtime ((const time_t *) &rawtime);
asctime(timeinfo);
printf ("Time and date: %s", asctime(timeinfo));

当我调用asctime(timeinfo)时崩溃了。任何人都可以告诉我如何正确地做到这一点?问题是我没有看到任何使用无符号整数或整数的示例。此http://www.cplusplus.com/reference/ctime/localtime/仅显示time_t示例,但从示例中不清楚如何使用uint32_t。

注意:还有警告:此十进制常量(3675431915)仅在ISO C90中无符号

2 个答案:

答案 0 :(得分:2)

简单地说,由于sizeof(time_t)未定义(通常是48),因此没有可移植的方式将uint32_t转换为time_t

一个原因 - 例如 - 在32位计算机上time_t甚至无法保存您在示例中提供的时间戳。

#include <time.h>
#include <stdio.h>
#include <stdint.h>

int
main(int argc, char *argv[]) {
    uint32_t rawtime = 3675431915u;

    struct tm * timeinfo;
    time_t t = rawtime;
    // note absence of indirect convert via pointer
    // I have no idea, why you wanted to do this, anyway
    timeinfo = localtime (&t);
    asctime(timeinfo);
    printf ("Time and date: %s", asctime(timeinfo));
    return 0;
}

将在具有64位Time and date: Thu Jun 20 19:18:35 2086的计算机上生成time_t,但在32位计算机上生成Time and date: Mon May 15 11:50:19 1950。这是因为范围溢出,将rawtime转换为time_t的有符号整数。

转换仅在假设time_t是所有目标平台上的有符号整数(无保证)的情况下有效。即使在这种情况下,您也应该防止溢出值。

答案 1 :(得分:-1)

试试这段代码。

/* localtime example */
#include <stdio.h>      /* puts, printf */
#include <time.h>       /* time_t, struct tm, time, localtime */
#include <stdint.h>  /* This header is part of the type support library, providing fixed width integer types. */

int main() {
    uint32_t rawtime=3675431915;
    struct tm * timeinfo;
    timeinfo = localtime ((const time_t *) &rawtime);
    asctime(timeinfo);
    printf ("Time and date: %s", asctime(timeinfo));
    return 0;
}