Я хочу использовать 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;
}
Диапазон функции _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 г.
time_t
и обработки времени. Работа с вычислениями даты/времени переносимым способом намного сложнее, чем вы думаете. - person Mark Benningfield   schedule 19.04.2019