Q & A: Как я могу определить, какой последний день месяца?

Я пытался написать конвертер часовых поясов по собственному усмотрению, и мне нужен был способ определить, каким был последний возможный день месяца. После некоторых исследований я обнаружил формулы для определения високосного года.

Это небольшой вклад, но, возможно, я сэкономлю кому-то еще те 20 минут, которые понадобились мне, чтобы понять и применить его.

Этот код принимает подписанный короткий месяц, индексированный как 0 (0 — январь), а также int-год, который также проиндексирован как 0 (2012 — 2012).

Он возвращает 1 индексированный день (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;
}
}
4

Другие решения

Как насчет

#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
3

Я использую простую функцию, которая возвращает всю дату в (из) (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

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);
-1
По вопросам рекламы [email protected]