我想在C中区分两个日期,但我收到了这样的输出:
未来日期:2013年11月18日22:8
当前日期:18-11-2013 22:8
我的代码来了:
#include <stdio.h>
#include <time.h>
int main(int argc, char *argv[])
{
// 2 years ahead
time_t unixtime = time(NULL);
struct tm *future = localtime(&unixtime);
future->tm_year += 2;
// current time
time_t unixtime_now = time(NULL);
struct tm *current = localtime(&unixtime_now);
printf("future date: %d-%d-%d %d:%d\n", future->tm_mday, 1 + future->tm_mon, 1900 + future->tm_year, future->tm_hour, future->tm_min);
printf("current date: %d-%d-%d %d:%d\n", current->tm_mday, 1 + current->tm_mon, 1900 + current->tm_year, current->tm_hour, current->tm_min);
return 0;
}
答案 0 :(得分:2)
那是因为localtime()不可重入。
当你这样做时
struct tm *future = localtime(&unixtime);
...
struct tm *current = localtime(&unixtime_now);
第一个调用返回指向运行时管理的某个静态位置的指针。第二个调用使用相同的位置来存储数据。所以现在future
和current
都指向完全相同的东西。
您需要将struct tm
复制到自己管理的存储空间中:例如
struct tm future = *localtime(&unixtime);
...
struct tm current = *localtime(&unixtime_now);
如果您的平台上有localtime_r
功能,请使用更合适的struct tm future;
localtime_r(&unixtime, &future);
...
struct tm current;
localtime_r(&unixtime, ¤t);
功能。
{{1}}
答案 1 :(得分:2)
localtime
的返回值是指向静态分配结构的指针,可能会被对日期/时间函数的进一步调用覆盖。如果您希望将指向数据保持更长时间,则需要复制它,或使用其他函数,例如localtime_r
。
localtime()函数将日历时间timep转换为相对于用户指定时区表示的细分时间表示。该函数就像调用tzset(3)一样,并将外部变量tzname设置为当前时区的信息,时区以协调世界时(UTC)与本地标准时间(以秒为单位)之差,如果是日光,则将日光设置为非零值储蓄时间规则适用于一年中的某些时段。 返回值指向静态分配的结构,该结构可能被后续调用任何日期和时间函数覆盖。 localtime_r()函数执行相同操作,但将数据存储在用户提供的内容中结构。它不需要设置tzname,timezone和daylight。