2013-11-03 65 views
2

我試圖在C中實現兩個簡單的轉換器,日期/時間到時間戳,反之亦然,沒有任何時間庫例程的依賴關係,例如mktime等。將日期/時間轉換爲時間戳,反之亦然

的時間戳是在幾秒鐘內,以及日期/時間結構是以下格式:

  • 無符號字符年:0至99(表示2000〜2099的範圍內)

  • unsigned char month:1 to 12

  • 無符號字符天:1〜31

  • 無符號字符小時:0到23

  • 無符號字符分鐘:0到59

  • 無符號字符第二:0到59

我想對dt2ts轉換器有第二意見(假設輸入是合法的):

unsigned int dt2ts(const dt_t* dt) 
{ 
    static unsigned short days[] = {0,31,59,90,120,151,181,212,243,273,304,334}; 
    return ((((dt->year*365+dt->year/4)+days[dt->month-1]+dt->day)*24+dt->hour)*60+dt->minute)*60+dt->second; 
} 

除此之外,我將不勝感激一些幫助完成ts2dt轉換器:

void ts2dt(unsigned int ts,dt_t* dt) 
{ 
    dt->second = ts%60; ts /= 60; 
    dt->minute = ts%60; ts /= 60; 
    dt->hour = ts%24; ts /= 24; 
    dt->day = ?????; 
    dt->month = ?????; 
    dt->year = ?????; 
} 

感謝

+0

讓我們希望這是一個練習,你不只是創建一個Y2100的錯誤。 :-)你在乎夏令時嗎?你肯定需要考慮閏年,當時有2月29日。 – torek

+1

http://pubs.opengroup.org/onlinepubs/000095399/functions/gmtime.html – Mat

+1

爲什麼你試圖把所有的代碼放在一行?它不是Perl或Python。這種「風格」確實很難讀懂。 – JIghtuse

回答

2

OP是所有準備好處理的時,分,秒。只需要Y,M,D的一點幫助。

注意:從2000年1月1日到2099年12月31日的天數至少需要一個16位整數。即使unsigned爲2個字節,也應該繼續工作。

unsigned DivRem(unsigned Dividend, unsigned Divisor, unsigned *Remainder) { 
    unsigned Quotient = Dividend/Divisor; 
    *Remainder = Dividend - Quotient*Divisor; 
    return Quotient; 
} 

void Day2000ToYMD(unsigned DaySince2000Jan1, unsigned *Y, unsigned *M, unsigned *D) { 
    unsigned OlympiadDay; // Every 4 years is an Olympiad 
    *Y = 4*DivRem(DaySince2000Jan1, 365*4+1, &OlympiadDay); 
    *D = 1; 
    if (OlympiadDay >= (31+29-1)) { // deal with Feb 29th and after 
    OlympiadDay--; 
    if (OlympiadDay == (31+29-1)) { 
     (*D)++; 
    } 
    } 
    unsigned YearDay;  // Day of the year 0 to 364 
    *Y += DivRem(OlympiadDay, 365, &YearDay); 
    static const unsigned short days[] = {0,31,59,90,120,151,181,212,243,273,304,334,365}; 
    *M = 1; 
    while (days[*M] <= YearDay) (*M)++; 
    *D += YearDay - days[*M - 1]; 
} 

[編輯]答案提供嘗試的一年,1月1日的概念保持至12月31這個答案不需要處理閏年年約100至400年,我一直保持這種風格。

一般來說,一旦添加了這兩條規則,如果將年初設置爲3月1日並在2月28日29日結束,則數學變得更容易。 FWIW,這個 Julian/Gregorian日曆的古代發展的更一致的看法。因此* 10月 * ober然後是第8個月和* 12月 *燼是第10個月。

相關問題