由单独的localtime调用的两个struct tm info返回相同的值

时间:2013-04-18 09:00:44

标签: c time

我有这个测试代码:

  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 tmi的{​​{1}}个信息。基本上,我需要获得j的月份,并将其与info1等月份进行比较。

在第13到25行进行打印,info2info1返回相同的值(即相同的秒数,相同的分钟数,相同的小时数等)。

两个问题:

  1. 为什么它们具有相同的值?
  2. 我应该如何获得info2info1
  3. 的不同值

2 个答案:

答案 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;
  }