簡體   English   中英

給定 tm_mday 和 tm_mon 如何計算 tm_yday?

[英]How to calculate tm_yday given tm_mday and tm_mon?

How do I convert "2012-03-02" into unix epoch time in C? 中的第二個答案? 確實提供了解決方案。 但它使用 tm_yday 而不是 tm 結構的 tm_mday 和 tm_mon。

我的輸入是人類可讀的日期和時間,所需的 output 是 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*86400my_tm.tm_mdaymy_tm.tm_mon方面的替代品

通過以下幫助程序 function,可以將“公歷采用日期”到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;
}

它使用以下幫助程序 function isyear將“公歷采用日期”范圍內的一年轉換為INT_MAX ,如果年份不是閏年則返回 0,如果年份是閏年則返回 1:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM