C: добавлять дни к датам независимо от ОС, до 1970 г.

Я хочу использовать mktime, чтобы добавить дни к моей дате. Код взят из здесь, инициализация структуры tm из здесь. Этот код работает в Linux (gcc):

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

int main(int argc, char **argv)
{
    struct tm t = { 0 };
    t.tm_mday += 40;
    time_t try1 = mktime(&t);
    /* show result */
    printf("%d %d %d %d %s", t.tm_year, t.tm_mon, t.tm_mday, try1, ctime(&try1));
    return 0;
}

Программа возвращает ожидаемое: 0 1 9 2089348096 Fri Feb 9 00:00:00 1900

Однако, когда я компилирую тот же код в Windows, используя

GNU C11 (Rev4, создан проектом MSYS2) версии 5.2.0 (x86_64-w64-mingw32), скомпилированный GNU C версии 5.2.0, GMP версии 6.0.0, MPFR версии 3.1.3, MPC версии 1.0.3

Я получаю этот вывод: 0 0 40 -1 (null).

Как добавить дни к датам в Windows?

ОБНОВЛЕНИЕ. Оказывается, mktime в Windows работает, только если дата вступления в силу после 1 января 1970 года. Весело. Вот небольшой пример:

int main(int argc, char **argv)
{
    struct tm t = { 0 };
    t.tm_year = 70;
    t.tm_mday = 1;

    t.tm_mday += 40;
    time_t try1 = mktime(&t);
    /* show result */
    printf("%d %d %d %d %s", t.tm_year, t.tm_mon, t.tm_mday, try1, ctime(&try1));
    return 0;
}

MS Docs :

Диапазон функции _mkgmtime32 — от полуночи 1 января 1970 года по всемирному координированному времени до 23:59:59 18 января 2038 года по всемирному координированному времени. Диапазон _mkgmtime64 — от полуночи 1 января 1970 года по всемирному координированному времени до 23:59:59 31 декабря 3000 года по всемирному координированному времени. Дата вне допустимого диапазона приводит к возвращаемому значению -1. Диапазон _mkgmtime зависит от того, определен ли _USE_32BIT_TIME_T. Если не определено (по умолчанию), диапазон равен _mkgmtime64; в противном случае диапазон ограничивается 32-битным диапазоном _mkgmtime32.

Вопрос остается в силе. Есть ли способ добавить дни к датам независимо от ОС? Желательно не ограничиваться периодом после 1 января 1970 г.


person rfg    schedule 19.04.2019    source источник
comment
Windows — не единственная ОС, использующая эпоху Unix в качестве основы для значений time_t и обработки времени. Работа с вычислениями даты/времени переносимым способом намного сложнее, чем вы думаете.   -  person Mark Benningfield    schedule 19.04.2019