time(NULL)返回不同的时间

时间:2012-10-08 15:35:57

标签: c time

我正在尝试使用time_t current_time = time(NULL)获取C中的当前时间。 据我了解,它将返回我当前的系统时间。 我稍后尝试使用struct tm* gmt = gmtime(&current_time)将其转换为GMT时间。

我使用ctime()asctime()函数打印两次。

我系统上的当前时间是GMT + 1.但是gmtime()会在current_time的同时返回给我。我无法理解为什么gmtime()同时回到我身边。任何帮助将不胜感激。

这里是代码和输出:Windows显示的当前时间是17:54(斯德哥尔摩区域; GMT + 1)。我希望有什么能让我回到15:54。或许我的理解是错误的......

time_t current_time = time(NULL);

struct tm* gmt = gmtime(&current_time);
struct tm* loc = localtime(&current_time);

printf("current time: %s\n", ctime(&current_time));
printf("gmt time %s\n", asctime(gmt));
printf("local time %s\n", asctime(loc));

输出:

current time: Mon Oct  8 17:54:06 2012

gmt time Mon Oct  8 17:54:06 2012

local time Mon Oct  8 17:54:06 2012

接受的解决方案: 来自Simes

那可能是你的问题。检查TZ环境变量的值;如果不存在,则默认为GMT。 Cygwin没有自动从Windows获取时区设置。另请参阅localtime returns GMT for windows programs running on cygwin shells

3 个答案:

答案 0 :(得分:1)

time()返回自纪元以来的秒数。 等于UTC(又名GMT)

Epoch是英国格林威治的1.1.1970,00:00。

所以事实上time()不会返回时间,而是时间差异

答案 1 :(得分:1)

time_t类型包含一个值,表示自UNIX纪元以来的秒数。 tm类型包含日历值。

gmtime()只是将系统时间(总是UTC)从time_t转换为tm。这就是价值观相同的原因。如果您想要表示当地时间(GMT + 1),那就是localtime()的用途。

答案 2 :(得分:0)

通过以下两行运行调试器:

struct tm* gmt = gmtime(&current_time);

struct tm* loc = localtime(&current_time);

在第二行中断,观察gmt的成员以及当您执行第二行时 - 您将看到一些gmt成员更改值。显然,库使用了一些静态内存。因此,在运行第二个

之前保存第一个语句的结果