2

我試圖寫一個自己的時區轉換器,我需要一種方法來確定這個月的最後一天是什麼時候。經過一番研究,我發現了尋找閏年的公式。問與答:如何確定每月的最後一天是什麼?

這是一個小小的貢獻,但也許我會拯救別人20分鐘,它讓我找出並應用它。

此代碼接受一個已簽名的短月份,索引編號爲0(0表示1月),同時也表示索引爲0的int年份(2012爲2012)。

它返回一個索引日(27日是第27日,但在SYSTEMTIME結構等中,您通常需要索引0 - 只是一個頭)。

回答

3
short _get_max_day(short month, int year) { 
    if(month == 0 || month == 2 || month == 4 || month == 6 || month == 7 || month == 9 || month == 11) 
     return 31; 
    else if(month == 3 || month == 5 || month == 8 || month == 10) 
     return 30; 
    else { 
     if(year % 4 == 0) { 
      if(year % 100 == 0) { 
       if(year % 400 == 0) 
        return 29; 
       return 28; 
      } 
      return 29; 
     } 
     return 28; 
    } 
} 
+0

'如果(!一年%4 == 0 &&年400%= 0)返回29,否則返回28'是一種更簡潔的方式表達我的想法。 – john 2013-03-26 06:42:14

+1

@john簡潔,但錯誤。 – 2013-03-26 06:53:01

+0

@AlexeyFrunze請提供更正或反例。 – john 2013-03-26 06:58:09

3

什麼

#include <time.h> 
#include <iostream> 

int LastDay (int iMonth, int iYear) 
{ 
    struct tm when; 
    time_t lastday; 

    // Set up current month 
    when.tm_hour = 0; 
    when.tm_min = 0; 
    when.tm_sec = 0; 
    when.tm_mday = 1; 

    // Next month 0=Jan 
    if (iMonth == 12) 
    { 
     when.tm_mon = 0; 
     when.tm_year = iYear - 1900 + 1; 
    } 
    else 
    { 
     when.tm_mon = iMonth; 
     when.tm_year = iYear - 1900; 
    } 
    // Get the first day of the next month 
    lastday = mktime (&when); 

    // Subtract 1 day 
    lastday -= 86400; 

    // Convert back to date and time 
    when = *localtime (&lastday); 

    return when.tm_mday; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    for (int m = 1; m <= 12; m++) 
     std::cout << "Last day of " << m << " is " << LastDay (m, 2002) << std::endl; 

    return 0; 
} 

它打印出來(2002年)......

Last day of 1 is 31 
Last day of 2 is 28 
Last day of 3 is 31 
Last day of 4 is 30 
Last day of 5 is 31 
Last day of 6 is 30 
Last day of 7 is 31 
Last day of 8 is 31 
Last day of 9 is 30 
Last day of 10 is 31 
Last day of 11 is 30 
Last day of 12 is 31 
+0

這太過分了。 – 2013-03-26 07:01:37

+0

有點點!但與多個ifss相比,這是一個乾淨的解決方案,並檢查閏年的不同規則等。 – Saqlain 2013-03-26 07:06:01

+0

誠然,有兩個可能的答案,但沒有問題!只是給你更多的方法來解決問題。 – 2013-04-17 01:11:11

0

我用一個簡單的函數,從一個返回在整個日期(標準)COleDateTime。它可能不像其他選項那麼快,但它非常有效,適用於閏年和相當愚蠢的證明。

這是我使用的代碼:

COleDateTime get_last_day_of_month(UINT month, UINT year)  
{ 
if(month == 2) 
    {            // if month is feb, take last day of March and then go back one day 
     COleDateTime date(year, 3, 1, 0, 0, 0); // 1 March for Year 
     date -= 1;         // go back one day (the standard class will take leap years into account) 
     return date; 
    } 
    else if(month == 4 || month == 6 || month == 9 || month == 11) return COleDateTime(year, month, 30, 0, 0, 0); 
    else return COleDateTime(year, month, 31, 0, 0, 0); 
} 
+0

你可以發佈代碼的一些解釋嗎?將有助於明確您的答案... – NREZ 2013-08-27 10:04:39

-1
Word Year, Month, Day; 
TDateTime datum_tdatetime = Date(); 

// first day of actual month 
datum_tdatetime.DecodeDate(&year, &month, &day); 
day = 1; 
datum_tdatetime = EncodeDate(year, month, day); 
// last day of previous month 
datum_tdatetime -= 1; 
// first day of previous month 
datum_tdatetime.DecodeDate(&year, &month, &day); 
day = 1; 
datum_tdatetime = EncodeDate(year, month, day); 
相關問題