我有这个测试代码:
1 #include <stdio.h>
2 #include <time.h>
3
4 int main() {
5 struct tm *info1;
6 struct tm *info2;
7 unsigned long i = 100000000;
8 unsigned long j = 200000000;
9
10 info1 = localtime((time_t *) &i);
11 info2 = localtime((time_t *) &j);
12
13 printf("%s(): info1->tm_sec = %d\n", __func__, info1->tm_sec);
14 printf("%s(): info1->tm_min = %d\n", __func__, info1->tm_min);
15 printf("%s(): info1->tm_hour = %d\n", __func__, info1->tm_hour);
16 printf("%s(): info1->tm_mday = %d\n", __func__, info1->tm_mday);
17 printf("%s(): info1->tm_mon = %d\n", __func__, info1->tm_mon);
18 printf("%s(): info1->tm_year = %d\n", __func__, info1->tm_year);
19
20 printf("%s(): info2->tm_sec = %d\n", __func__, info2->tm_sec);
21 printf("%s(): info2->tm_min = %d\n", __func__, info2->tm_min);
22 printf("%s(): info2->tm_hour = %d\n", __func__, info2->tm_hour);
23 printf("%s(): info2->tm_mday = %d\n", __func__, info2->tm_mday);
24 printf("%s(): info2->tm_mon = %d\n", __func__, info2->tm_mon);
25 printf("%s(): info2->tm_year = %d\n", __func__, info2->tm_year);
26
27
28
29 return 0;
30 }
输出结果为:
main(): info1->tm_sec = 20
main(): info1->tm_min = 33
main(): info1->tm_hour = 3
main(): info1->tm_mday = 4
main(): info1->tm_mon = 4
main(): info1->tm_year = 76
main(): info2->tm_sec = 20
main(): info2->tm_min = 33
main(): info2->tm_hour = 3
main(): info2->tm_mday = 4
main(): info2->tm_mon = 4
main(): info2->tm_year = 76
第7行和第8行实际上是时间戳(自纪元以来的秒数),因为从调用函数传递的无符号长度(我刚刚将其硬编码)。
第10行和第11行是我关注的问题。我需要获取两个时间戳struct tm
和i
的{{1}}个信息。基本上,我需要获得j
的月份,并将其与info1
等月份进行比较。
在第13到25行进行打印,info2
和info1
返回相同的值(即相同的秒数,相同的分钟数,相同的小时数等)。
两个问题:
info2
和info1
?答案 0 :(得分:1)
The documention明确说明原因:
asctime(),ctime(),gmtime()和localtime()这四个函数返回一个指向静态数据的指针,因此不是线程安全的。
换句话说,您在每次调用时都会获得指向标准库所拥有的相同静态结构的指针。您需要复制数据以防止这种情况发生。
答案 1 :(得分:1)
localtime() - &gt;它的返回值指向静态分配的结构,后者可能会被后续调用任何日期和时间函数覆盖。 因此,使用localtime_r()将数据存储在用户提供的结构中。
#include <stdio.h>
#include <time.h>
int main() {
struct tm info1;
struct tm info2;
unsigned long i = 100000000;
unsigned long j = 200000000;
localtime_r((time_t *) &i,&info1);
localtime_r((time_t *) &j,&info2);
printf("%s(): info1->tm_sec = %d\n", __func__, info1.tm_sec);
printf("%s(): info1->tm_min = %d\n", __func__, info1.tm_min);
printf("%s(): info1->tm_hour = %d\n", __func__, info1.tm_hour);
printf("%s(): info1->tm_mday = %d\n", __func__, info1.tm_mday);
printf("%s(): info1->tm_mon = %d\n", __func__, info1.tm_mon);
printf("%s(): info1->tm_year = %d\n", __func__, info1.tm_year);
printf("%s(): info2->tm_sec = %d\n", __func__, info2.tm_sec);
printf("%s(): info2->tm_min = %d\n", __func__, info2.tm_min);
printf("%s(): info2->tm_hour = %d\n", __func__, info2.tm_hour);
printf("%s(): info2->tm_mday = %d\n", __func__, info2.tm_mday);
printf("%s(): info2->tm_mon = %d\n", __func__, info2.tm_mon);
printf("%s(): info2->tm_year = %d\n", __func__, info2.tm_year);
return 0;
}