C时差

时间:2013-11-18 21:11:30

标签: c time.h

我想在C中区分两个日期,但我收到了这样的输出:

  

未来日期:2013年11月18日22:8

     

当前日期:18-11-2013 22:8

我的代码来了:

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

int main(int argc, char *argv[])
{   
    // 2 years ahead
    time_t unixtime = time(NULL);
    struct tm *future = localtime(&unixtime);
    future->tm_year += 2;

    // current time
    time_t unixtime_now = time(NULL);
    struct tm *current = localtime(&unixtime_now);

    printf("future date: %d-%d-%d %d:%d\n", future->tm_mday, 1 + future->tm_mon, 1900 + future->tm_year, future->tm_hour, future->tm_min);
    printf("current date: %d-%d-%d %d:%d\n", current->tm_mday, 1 + current->tm_mon, 1900 + current->tm_year, current->tm_hour, current->tm_min);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

那是因为localtime()不可重入。

当你这样做时

struct tm *future = localtime(&unixtime);
 ... 
struct tm *current = localtime(&unixtime_now);

第一个调用返回指向运行时管理的某个静态位置的指针。第二个调用使用相同的位置来存储数据。所以现在futurecurrent都指向完全相同的东西。

您需要将struct tm复制到自己管理的存储空间中:例如

struct tm future = *localtime(&unixtime);
 ... 
struct tm current = *localtime(&unixtime_now);

如果您的平台上有localtime_r功能,请使用更合适的struct tm future; localtime_r(&unixtime, &future); ... struct tm current; localtime_r(&unixtime, &current); 功能。

{{1}}

答案 1 :(得分:2)

localtime的返回值是指向静态分配结构的指针,可能会被对日期/时间函数的进一步调用覆盖。如果您希望将指向数据保持更长时间,则需要复制它,或使用其他函数,例如localtime_r

请参阅localtime(3) man page

  

localtime()函数将日历时间timep转换为相对于用户指定时区表示的细分时间表示。该函数就像调用tzset(3)一样,并将外部变量tzname设置为当前时区的信息,时区以协调世界时(UTC)与本地标准时间(以秒为单位)之差,如果是日光,则将日光设置为非零值储蓄时间规则适用于一年中的某些时段。 返回值指向静态分配的结构,该结构可能被后续调用任何日期和时间函数覆盖。 localtime_r()函数执行相同操作,但将数据存储在用户提供的内容中结构。它不需要设置tzname,timezone和daylight。