计算距C中两个日期的天数差

问题描述 投票:0回答:1

我的代码有问题:我需要计算两个日期之间的时差。我在结构体中有日期。

为什么结果为0?我在这里被封锁了2天。

typedef struct {
    int day;
    int month;
    int year;
} DIAGNOSISDATE;

DIAGNOSISDATE dateDiagnosis[3];

typedef struct {
    int day;
    int month;
    int year;
} HEALINGDATE;

HEALINGDATE dateHealing[3];

typedef struct {
    char firstName[20];
    char lastName[20];
    char fiscalCode[17];
    STATESICK stateSick;
    DIAGNOSISDATE dateDiagnosis;
    HEALINGDATE dateHealing;
} SICKREGION;

SICKREGION sickregion[SIZESICK];

我在这里有我的职能:

void timeDiff() {
    struct tm ts;
    char buf[80];
    //int getTimeDiff = 0;
    long total = 0;
    int i = 0;
    int k = 0;
    int j = 0;
    for (i = 0; i < 1; i++) {
        for (j = 0; j < 1; j++) {
            for (k = 0; k < 3; k++) {
                struct tm time1;
                time1.tm_mday = region[i].hospital[j].sickregion[k].dateHealing.day;
                time1.tm_mon = region[i].hospital[j].sickregion[k].dateHealing.month;
                time1.tm_year = region[i].hospital[j].sickregion[k].dateHealing.year;
                struct tm time0;
                time0.tm_mday = region[i].hospital[j].sickregion[k].dateDiagnosis.day;
                time0.tm_mon = region[i].hospital[j].sickregion[k].dateDiagnosis.month;
                time0.tm_year = region[i].hospital[j].sickregion[k].dateDiagnosis.year;
                time_t rawtime = difftime(mktime(&time1), mktime(&time0));
                // Total = (Total + rawtime);

                ts = *localtime(&rawtime);
                //Total = (rawtime + Total) + 1;
                total += (rawtime / 86400);
            }
        }
    }
    strftime(buf, sizeof(buf), "%j", &ts);
    // printf("%s\n", buf);
    printf("%ld\n", total);
}

我不知道问题出在哪里。无论如何在我的Macbook中它将运行,在Windows中不起作用。 :/代码是一样的。我试图在typedef内对the struct tm 0 and struct tm 1进行二位化处理,但没有任何区别。有人知道问题出在哪里吗?

c timestamp typedef date-difference time.h
1个回答
1
投票

您的代码具有未定义的行为,因为您没有初始化tm_time1tm_time2的其他成员。快速解决方法是:

    struct tm time1 = { 0 };
    struct tm time2 = { 0 };

[另一个问题是,您将类型为difftimedouble的返回值存储到time_t变量中。时间差可能为负,time_t可能为无符号类型,导致rawtime / 86400产生较大的正数。您可能应该使用long来存储时间差,如果该差值变为负数,则应拒绝数据。

解决此问题后,long rawtime = difftime(mktime(&time1), mktime(&time0));将以秒为单位计算上午0:00:00的两个日期之间的时差。

将其除以86400并不完全正确,因为如果间隔中存在由于DST引起的一个或多个本地时间变化,则差值可能不是86400的精确倍数。我建议您使用:

    total += (rawtime + 3600 * 3) / 86400; // difference in days, ignoring DST.

或者,您可以将rawtime定义为double并使用:

    total += round(rawtime / 86400.0);

最后,计算ts = *localtime(&rawtime);完全没有意义:将秒数转换为日期只有在该秒数表示有效日期时才有意义。 rawtime是持续时间,不是有效日期。

© www.soinside.com 2019 - 2024. All rights reserved.