我試圖寫一個自己的時區轉換器,我需要一種方法來確定這個月的最後一天是什麼時候。經過一番研究,我發現了尋找閏年的公式。問與答:如何確定每月的最後一天是什麼?
這是一個小小的貢獻,但也許我會拯救別人20分鐘,它讓我找出並應用它。
此代碼接受一個已簽名的短月份,索引編號爲0(0表示1月),同時也表示索引爲0的int年份(2012爲2012)。
它返回一個索引日(27日是第27日,但在SYSTEMTIME結構等中,您通常需要索引0 - 只是一個頭)。
我試圖寫一個自己的時區轉換器,我需要一種方法來確定這個月的最後一天是什麼時候。經過一番研究,我發現了尋找閏年的公式。問與答:如何確定每月的最後一天是什麼?
這是一個小小的貢獻,但也許我會拯救別人20分鐘,它讓我找出並應用它。
此代碼接受一個已簽名的短月份,索引編號爲0(0表示1月),同時也表示索引爲0的int年份(2012爲2012)。
它返回一個索引日(27日是第27日,但在SYSTEMTIME結構等中,您通常需要索引0 - 只是一個頭)。
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;
}
}
什麼
#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
這太過分了。 – 2013-03-26 07:01:37
有點點!但與多個ifss相比,這是一個乾淨的解決方案,並檢查閏年的不同規則等。 – Saqlain 2013-03-26 07:06:01
誠然,有兩個可能的答案,但沒有問題!只是給你更多的方法來解決問題。 – 2013-04-17 01:11:11
我用一個簡單的函數,從一個返回在整個日期(標準)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);
}
你可以發佈代碼的一些解釋嗎?將有助於明確您的答案... – NREZ 2013-08-27 10:04:39
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);
'如果(!一年%4 == 0 &&年400%= 0)返回29,否則返回28'是一種更簡潔的方式表達我的想法。 – john 2013-03-26 06:42:14
@john簡潔,但錯誤。 – 2013-03-26 06:53:01
@AlexeyFrunze請提供更正或反例。 – john 2013-03-26 06:58:09