C: добавить дни к датам, независимым от ОС, до 1970 г. - PullRequest
0 голосов
/ 19 апреля 2019

Я хочу использовать 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 года.

1 Ответ

0 голосов
/ 17 июня 2019
void second_calculate()
{

    //47 year       ------>1970+47=2017
    //12 day        ------>12 leap year   29 february!!
    //test=0        ------> 00:00:00 01.01.1970   

    int _sec = 1;
    int _min = 60;
    int _hour = 60 * 60;
    int _day = 24 * 60 * 60;
    int _year = 365 * 24 * 60 * 60;


    long long test = 
        47   * _year            //  1970 +47  ---->  2017 
        + 12 * _day             //  leap year ---->  47/4 
        + 40 * _day             //  new year +40 day ---->  february 10
        + 22 * _hour            //  evening  22:00:00 
           +0* _min             //  
           +0* _sec;            //  



    //grennwich
    tm* ptm3 = gmtime(&test);
    printf("date: %s\n", asctime(ptm3));    //22:00:00 10.02.2017 


}
...