Я хочу использовать mktime
, чтобы добавить дни к моей дате. Код взят из здесь , инициализация tm struct из здесь . Этот код работает в 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?
UPDATE . Оказывается, 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 года по UTC до 23:59:59 31 декабря 3000 года по UTC. Дата вне допустимого диапазона приводит к возвращаемому значению -1. Диапазон _mkgmtime зависит от того, определен ли _USE_32BIT_TIME_T. Если не определено (по умолчанию), диапазон равен _mkgmtime64; в противном случае диапазон ограничен 32-битным диапазоном _mkgmtime32.
Вопрос все еще стоит. Есть ли способ добавить дни к датам независимо от ОС? Желательно, не ограничиваясь после 1 января 1970 года.