【问题标题】:How to calculate tm_yday given tm_mday and tm_mon?给定 tm_mday 和 tm_mon 如何计算 tm_yday?
【发布时间】:2021-08-04 13:11:22
【问题描述】:

How do I convert "2012-03-02" into unix epoch time in C? 中的第二个答案确实提供了解决方案。但它使用 tm_yday 而不是 tm 结构的 tm_mday 和 tm_mon。

我的输入是人类可读的日期和时间,所需的输出是 UNIX 纪元时间。

    int main(int argc, char *argv[])
    {
        char timeString[80] = {"05 07 2021 00 33 51"}; //epoch is 1620347631000
        struct tm my_tm = {0};
    
        if(sscanf(timeString, "%d %d %d %d %d %d",  &my_tm.tm_mon, &my_tm.tm_mday, &my_tm.tm_year, &my_tm.tm_hour, &my_tm.tm_min, &my_tm.tm_sec)!=6)
        {
            /* ... error parsing ... */
            printf(" sscanf failed");
        }
    
        // In the below formula, I can't use my_tm.tm_yday as I don't have the value for it. 
        //I want to use my_tm.tm_mday and tm_mon. 
        printf("%d",my_tm.tm_sec + my_tm.tm_min*60 + my_tm.tm_hour*3600 + my_tm.tm_yday*86400 +
            (my_tm.tm_year-70)*31536000 + ((my_tm.tm_year-69)/4)*86400 -
            ((my_tm.tm_year-1)/100)*86400 + ((my_tm.tm_year+299)/400)*86400 );
    
        return EXIT_SUCCESS;
    }

因此,换句话说,我正在寻找 my_tm.tm_yday*86400 的替代品 my_tm.tm_mdaymy_tm.tm_mon

【问题讨论】:

  • 请描述问题。您正在处理的输入数据是什么?期望的输出或状态是什么?你的代码在哪里?
  • 感谢您的回复。我已经更新了问题
  • 使用mktime,如您链接到的问题的this answer。请注意,您应该将tm.tm_year 设置为实际年份减去1900,并将tm.tm_mon 设置为实际月份减去1。

标签: c datetime time epoch


【解决方案1】:

“公历采用日期”到 INT_MAX 范围内的年份和 1 到 12 范围内的月份可以通过以下方式转换为 0 到 365 范围内从零开始的“年日”辅助函数:

int yday(int year, int month)
{
    static const short int upto[12] =
        {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
    int yd;

    yd = upto[month - 1];
    if (month > 2 && isleap(year))
        yd++;
    return yd;
}

它使用以下帮助函数 isyear,它在“公历采用日期”到 INT_MAX 的范围内花费一年,如果年份不是闰年,则返回 0,如果年份是闰年,则返回 1年份:

int isleap(int year)
{
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2014-11-24
    • 1970-01-01
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多