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

时间:2013-10-17 09:08:58

标签: c

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

这是我的代码:

#include<stdio.h>
#include<conio.h>
#include<time.h>

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

4 个答案:

答案 0 :(得分:5)

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

#include <stdio.h>
#include <time.h>
#include <string.h>

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

答案 1 :(得分:4)

来自doc of localtime

  

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

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

测试:

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

输出:

0x7f7d9d2eee80
0x7f7d9d2eee80

答案 2 :(得分:2)

localtime()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<stdio.h>
#include<conio.h>
#include<time.h>

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?time?str的不同声明。

答案 3 :(得分:0)

  

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

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

@keltar完美答案一样,要保留struct tm信息,代码应在后续struct tm来电之前复制localtime(), gmtime()

而不是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);