localtime()函数显示两个等于date

为什么当我尝试用不同的参数显示2个日期时,我放入localtime()函数,控制台显示2个相等的日期?

这是我的代码:

#include #include #include int main() { time_t time1, time2; struct tm *timeinfo1, *timeinfo2; char *time1str, *time2str; time1 = 3600; time2 = 3720; timeinfo1 = localtime(&time1); timeinfo2 = localtime(&time2); time1str = asctime(timeinfo1); time2str = asctime(timeinfo2); puts(time1str); puts(time2str); getch(); return 0; } 

两次调用localtimeasctime之间的数据不会持续存在。 你必须在某处复制数据。 这是更正的示例(strncpy仍然没有问题):

 #include  #include  #include  int main() { time_t time1, time2; struct tm timeinfo1, timeinfo2, *ti; char time1str[256], time2str[256], *tstr; time1 = 3600; time2 = 3720; ti = localtime(&time1); memcpy(&timeinfo1, ti, sizeof(*ti)); ti = localtime(&time2); memcpy(&timeinfo2, ti, sizeof(*ti)); tstr = asctime(&timeinfo1); strncpy(time1str, tstr, sizeof(time1str) - 1); tstr = asctime(&timeinfo2); strncpy(time2str, tstr, sizeof(time1str) - 1); puts(time1str); puts(time2str); return 0; } 

来自当地时间的文件 :

返回的值指向一个内部对象,其有效性或值可能会被后续调用gmtime或localtime所改变。

localtime()返回两次相同的指针:你在同一个数据上工作两次。

测试:

 printf("%p\n", localtime(&time1)); printf("%p\n", localtime(&time2)); 

输出:

 0x7f7d9d2eee80 0x7f7d9d2eee80 

localtime()asctime()每个都返回一个指向内部缓冲区的指针。 每次asctime() localtime()asctime()时都会覆盖此缓冲区,因此在OP代码中,第一次调用的结果将被第二次调用的结果替换。

打印不同的时间只是重新排列调用的顺序,如下所示:

 timeinfo1 = localtime(&time1); time1str = asctime(timeinfo1); puts(time1str); timeinfo2 = localtime(&time2); time2str = asctime(timeinfo2); puts(time2str); 

另外,如果使用POSIX兼容系统,则使用localtime_r()asctime_r() ,它们使用调用者提供的缓冲区:

 #define _POSIX_C_SOURCE 1 #include #include #include int main(void) { time_t time1 = 3600; time_t time2 = 3720; struct tm timeinfo1 = {0}; struct tm timeinfo2 = {0}; char time1str[32] = ""; char time2str[32] = ""; localtime_r(&time1, &timeinfo1); localtime_r(&time2, &timeinfo2); asctime_r(&timeinfo1, timestr1); asctime_r(&timeinfo2, timestr2); puts(time1str); puts(time2str); getch(); return 0; } 

请注意vàriablestimeinfo的不同声明timeinfo? time?str

为什么……控制台显示2个相同的日期

localtime()gmtime()返回指向共享struct tm内存位置的指针。

就像@keltar的好答案一样,为了保留struct tm信息,代码应该在后续的localtime(), gmtime()调用之前复制该struct tm

而不是mempcy()一个简单的赋值=会做。

 // struct tm *timeinfo1, *timeinfo2; // Not pointers struct tm timeinfo1, timeinfo2; // ... but structures. time1 = 3600; time2 = 3720; // timeinfo1 = localtime(&time1); // Rather than copy the pointer // timeinfo2 = localtime(&time2); // v--------------------- // Notice the * timeinfo1 = *localtime(&time1); // Copy the structure timeinfo2 = *localtime(&time2);