试着写我自己的日期程序,需要检查C#中指定月份的最大日期

时间:2013-06-15 04:23:52

标签: c#

我正在尝试用C#编写自己的Date程序,我遇到的问题是,当用户输入例如2-31的日期时,程序允许它。我想创建一个条件,我可以匹配输入的月份,然后从中查看当月是否有可用的日期。我在下面使用这个代码,但是它给了我一个例外,例如10月10日这应该是正确的。如果我评论这个日期有效,但它不会检查以匹配月份。

public int Day
    {
        get
        {
            return day;
        } 
        private set 
        {
            //int[] daysPerMonth = { 0, 31, 28, 31, 30, 31, 30, 
            //                 31, 31, 30, 31, 30, 31 };

            //// check if day in range for month
            //if (value > 0 && value <= daysPerMonth[Month])
            //    day = value;

            //else // day is invalid
            //    throw new ArgumentOutOfRangeException(
            //       "Day", value, "Day out of range for current month/year");

            if (value > 0 && value <= 31) 
                day = value;
            else 
                throw new ArgumentOutOfRangeException("Day", value, "Day must be 1-31");

        } 
    } 

2 个答案:

答案 0 :(得分:1)

您必须知道用户选择的月份以及年份(以正确处理闰年)。

它必须是这样的:

public int Day
{
    get
    {
        return day;
    } 
    private set 
    {
        var endOfMonth = new DateTime(year, month, 1).AddMonths(1).AddDays(-1);
        if (value > 0 && value <= endOfMonth.Day) 
            day = value;
        else 
        {
            var message = string.Format("Day must be between {0} and {1}", 1 endOfMonth.Day);
            throw new ArgumentOutOfRangeException("Day", value, message);
        }
    } 
} 

yearmonth是您班级中的其他字段。如果你真的想在没有引用DateTime类的情况下这样做,我建议将这个逻辑提取到一个静态类中,这个类可以进行数学计算,而不必在你想要获得最后一天的任何时候重新编码它这个月。

public static class DateHelper
{
    private int[] daysInMonth = new[] { 31, 28, 31, 30, 31, 30, 
                                        31, 31, 30, 31, 30, 31 };

    public static bool IsLeapYear(int year)
    {
        // TODO: taken from wikipedia, can be improved
        if (year % 400 == 0)
            return true;
        else if (year % 100 == 0)
            return false;
        else if (year % 4 == 0)
            return true;
        return false;
    }

    public static bool GetDaysInMonth(int year, int month)
    {
        // TODO: check for valid ranges
        var days = daysInMonth[month - 1];
        if (month == 2 && IsLeapYear(year))
            days++;
        return days;
    }
}

然后你可以像这样使用它:

public int Day
{
    get
    {
        return day;
    } 
    private set 
    {
        var endOfMonth = DateHelper.GetDaysInMonth(year, month);
        if (value > 0 && value <= endOfMonth) 
            day = value;
        else 
        {
            var message = string.Format("Day must be between {0} and {1}", 1 endOfMonth);
            throw new ArgumentOutOfRangeException("Day", value, message);
        }
    } 
} 

答案 1 :(得分:1)

如果必须使用 DateTime 完成,可以使用

完成
DateTime.DaysInMonth(Year, Month);  

Refrence