3

私は独自のタイムゾーン コンバーターを作成しようとしていましたが、その月の最終日を特定する方法が必要でした。いくつかの調査の結果、うるう年を見つけるための公式を発見しました。

これは小さな貢献ですが、私がそれを理解して適用するのにかかった 20 分を他の誰かのために節約できるかもしれません。

このコードは、0 でインデックス付けされた符号付きの短い月 (0 は 1 月) と、同様に 0 としてインデックス付けされた int 年 (2012 年は 2012 年) を受け入れます。

インデックス付きの 1 日を返します (27 日は 27 日ですが、SYSTEMTIME 構造などでは、通常、インデックス付きの 0 が必要です。注意してください)。

4

6 に答える 6

4
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;
    }
}
于 2013-03-26T06:36:07.007 に答える
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
于 2013-03-26T06:55:35.043 に答える