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; }
两次调用localtime
或asctime
之间的数据不会持续存在。 你必须在某处复制数据。 这是更正的示例(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);