首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算tm_yday给定的tm_mday和tm_mon?

如何计算tm_yday给定的tm_mday和tm_mon?
EN

Stack Overflow用户
提问于 2021-05-14 10:42:01
回答 1查看 273关注 0票数 0

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

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

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

发布于 2021-05-14 13:24:45

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

代码语言:javascript
复制
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,如果该年是闰年,则返回0:

代码语言:javascript
复制
int isleap(int year)
{
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67532995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档