C:在不依赖操作系统的日期上加上1970年之前的日期

时间:2019-04-19 16:22:50

标签: c windows mingw mingw-w64 mktime

我想使用mktime在我的约会中添加天数。代码来自here,tm结构初始化自here。这段代码在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上为日期添加天数?

更新。原来,只有在生效日期为1970年1月1日之后,Windows上的mktime才有效。这是一个小例子:

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函数的范围是从UTC的1970年1月1日午夜到UTC的2038年1月18日23:59:59。 _mkgmtime64的范围是从UTC 1970年1月1日午夜到UTC 3000年12月31日23:59:59。超出范围的日期将导致返回值为-1。 _mkgmtime的范围取决于是否定义了_USE_32BIT_TIME_T。如果未定义(默认值),则范围是_mkgmtime64;否则,范围限制为_mkgmtime32的32位范围。

问题仍然存在。有什么方法可以增加日期而不依赖于操作系统?最好不限于1970年1月1日之后。

1 个答案:

答案 0 :(得分:0)

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 


}
相关问题