2

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

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

Этот код принимает подписанный короткий месяц с индексом 0 (0 - январь) и int year, который также индексируется как 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; 
    } 
} 
+0

'если (! Год% 4 == 0 && год% 400 = 0) вернуться 29 еще вернуться 28' является более емким способом чтобы выразить это, я думаю. – john

+1

@john Кратко, но неправильно. –

+0

@AlexeyFrunze Пожалуйста, предоставьте пример коррекции или счетчика. – john

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

Это перебор. –

+0

Немного! но чистое решение по сравнению с несколькими ifss и проверять разные правила для високосного года и т. д. – Saqlain

+0

Правда, нет проблем с двумя возможными ответами! Просто дает вам больше способов атаковать проблему. –

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

-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);