繁体   English   中英

C struct tm 时间 - 添加小时

[英]C struct tm time - add hours

我有struct tm代表时间1900-01-01 00:00:00 如何在小时内添加偏移量? 例如,我的时间偏移量为1048621 (大约 119.7 年)。

假设生成的日期/时间落入time_t可表示的范围内,您可以将小时偏移量添加到tm::tm_hour然后调用mktime进行规范化。

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

int main()
{
    struct tm t = { 0 };
    t.tm_mday = 1;  // Jan 1st 1900

    t.tm_hour = 1048621;
    if(mktime(&t) == -1) return 1;

    printf("%d-%02d-%02d %02d:%02d:%02d\n",
           t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
           t.tm_hour, t.tm_min, t.tm_sec);

    return 0;
}

Output

2019-08-17 13:00:00

[编辑] 正如评论中所指出的,上述mktime调用因 MSVC 而失败。 事实证明,微软的mktime实现对tm参数进行了预检查,如果tm_year < 69之前/甚至不查看其他tm字段,则无条件失败。 虽然如果结束日期/时间超出time_t范围,预计mktime会失败,特别是如果它早于纪元的开始(通常是 1970 年 1 月 1 日),但通常应该(重新)规范化之后进行此类检查.

下面是添加范围验证的更新代码,并已验证可与gccmsvc一起使用。

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

int main()
{
    const int tmYear1970 = 70;
    const int tmDay1970 = tmYear1970 * 365 + tmYear1970 / 4; //      25568
    const int tmHour1970 = tmDay1970 * 24;                   //     613632
    const int tmHourMax = INT_MAX - tmHour1970;              // 2146870015

    int tmHour = 1048621;
    if(tmHour < tmHour1970 || tmHour > tmHourMax) return 2;

    struct tm t = { 0 };
    t.tm_mday = 1; // Jan 1st 1900 12 AM

    t.tm_year = tmYear1970;
    t.tm_hour = tmHour - tmHour1970;
    t.tm_isdst = -1;
    if (mktime(&t) == -1) return 1;

    printf("%d-%02d-%02d %02d:%02d:%02d\n",
           t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
           t.tm_hour, t.tm_min, t.tm_sec);

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM