我可以在同一文件中使用来自 time.h 的两个 tm 结构吗?

Can I use two tm struct from time.h in the same file?

我正在尝试做一个图书借阅系统可以告诉用户他们有return这本书的日期。因为我必须使用数据来检查借阅次数是否超过限制。我尝试使用两个tm结构。

struct tm *Olddate;
struct tm *Newdate;

我在这样的结构之一中添加了天数

Newdate->tm_mday += 7;

当我尝试打印出这两个不同的结构时,输出在某种程度上是相同的。

printf("Current local time and date: %s", asctime(Olddate));
printf("Current new time and date: %s", asctime(Newdate));

输出:

Current local time and date: Tue May 17 21:37:16 2022
New time and date: Tue May 17 21:37:16 2022

最小可重现示例:

#include <stdio.h>
#include <time.h>
int main () {
    time_t rawtime;

    struct tm *Olddate;
    struct tm *Newdate;

    time( &rawtime );

    Olddate = localtime(&rawtime);
    Newdate = localtime(&rawtime);
    
    Newdate->tm_mday += 7;

    printf("Current local time and date: %s", asctime(Olddate));
    printf("New time and date: %s", asctime(Newdate));
    return 0;
}

localtime 函数 returns 指向静态数据的指针,因此该数据的内容可以在后续调用中被覆盖。

您应该改用 localtime_r,它接受要填充的 struct tm 地址。

time_t rawtime;

struct tm Olddate;
struct tm Newdate;

time( &rawtime );

localtime_r(&rawtime, &Olddate);
localtime_r(&rawtime, &Newdate);

Newdate.tm_mday += 7;

printf("Current local time and date: %s", asctime(&Olddate));
printf("New time and date: %s", asctime(&Newdate));

如果您使用的是 MSVC,请改用 localtime_s

localtime_s(&Olddate, &rawtime);
localtime_s(&Newdate, &rawtime);