рассчитать разницу в днях от двух дат в C - PullRequest
0 голосов
/ 26 марта 2020

У меня проблема с моим кодом: мне нужно рассчитать разницу между двумя датами. У меня есть даты внутри структуры.

Почему результат равен 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 не работает. : / код такой же. Я пытался dichiarate the struct tm 0 and struct tm 1 внутри моего typedef, но без различий. Кто-нибудь знает, в чем проблема?

1 Ответ

2 голосов
/ 26 марта 2020

Ваш код имеет неопределенное поведение, потому что вы не инициализируете других членов tm_time1 и tm_time2. Быстрое решение проблемы:

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

Другая проблема заключается в сохранении возвращаемого значения difftime типа double в переменной time_t. Разница во времени может быть отрицательной, а time_t может иметь тип без знака, в результате чего rawtime / 86400 выдает большое положительное число. Вам, вероятно, следует использовать long для хранения разницы во времени и отклонения данных, если эта разница окажется отрицательной.

Если эта проблема исправлена, long rawtime = difftime(mktime(&time1), mktime(&time0)); вычислит разницу во времени между двумя датами в 0: 00:00 утра в секундах.

Деление на 86400 не совсем корректно, поскольку разница может не быть точным кратным 86400, если в интервале было одно или несколько изменений местного времени из-за перехода на летнее время. Я предлагаю вам использовать:

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

Альтернативно, вы можете определить rawtime как double и использовать:

    total += round(rawtime / 86400.0);

Наконец, вычисления ts = *localtime(&rawtime); не имеют никакого смысла вообще : преобразование количества секунд в дату имеет смысл только в том случае, если это количество секунд соответствует действительной дате. rawtime - это продолжительность, а не действительная дата.

...