我有一个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中无符号
答案 0 :(得分:2)
简单地说,由于sizeof(time_t)
未定义(通常是4
或8
),因此没有可移植的方式将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;
}