c#检查日期时间是否有效

时间:2015-11-18 20:47:40

标签: c# .net visual-studio datetime

我在C#中创建自己的DateTime类,由于某种原因我的检查不起作用。当我运行程序并输入一个日期时,它总是停止并到达最后一行,即#34; Day"方法并说" ArgumentOutOfException。无论如何都要解决这个问题并让我的支票叫做"价值"工作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace date
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("\t\t\t\t\t\tNextDate Application\n\t\t\t\t\t-------------------------------------");

            Console.WriteLine("please enter date as dd/MM/yyyy");
            int day;
            int month;
            int year;

            string[] read = Console.ReadLine().Split('/');
            day = int.Parse(read[0]);
            month = int.Parse(read[1]);
            year = int.Parse(read[2]);

            Date date = new Date(day, month, year);
            Console.WriteLine("{0}/{1}/{2}", date.Day, date.Month, date.Year);
            Console.ReadLine();
        }

        class Date
        {
            private int _month; // 1-12
            private int _day; // 1-31 depending on month
            private int _year;

            public Date(int day, int month, int year)
            {
                Day = day;
                Month = month;
                Year = year;
            }

            public int Year
            {
                get { return _year; }
                set
                {
                    if (value >= 1820 && value <= 2020)
                        _year = value;
                    else
                        throw new ArgumentOutOfRangeException("year", value, "year out of range");
                }
            }

            public int Month
            {
                get { return _month; }
                set
                {
                    if (value > 0 && value <= 12)
                        _month = value;
                    else
                        throw new ArgumentOutOfRangeException("Month", value, "Month must be 1-12");
                }
            }

            public int Day
            {
                get { return _day; }
                set
                {

                    int[] days = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

                    if (value > 0 && value <= days[_month])
                        _day = value;

                    else if (_month == 2 && value == 29 &&
                        _year % 400 == 0 || (_year % 4 == 0 && _year % 100 != 0))
                        _day = value;
                    else
                    throw new ArgumentOutOfRangeException("Day", value, "Day is out of range");



                }

            }
        }
    }
}

3 个答案:

答案 0 :(得分:5)

您在构造函数中执行的第一件事是设置Day属性:

public Date(int day, int month, int year)
{
    Day = day;
    Month = month;
    Year = year;
}

该setter 做什么?很多,似乎。具体来说,首先检查一下:

if (value > 0 && value <= days[_month])

对于您的输入(在上面的评论中),value33 > 0是真的,所以没关系。但3不是<= 0。此时days[_month]0。所以这种情况是错误的。

你的下一个条件是:

else if (_month == 2 && value == 29 &&

这也是错误的,因为_month目前是0(而value3)。

那么你的方法有什么作用呢?这样:

throw new ArgumentOutOfRangeException("Day", value, "Day is out of range");

这解释了您获得ArgumentOutOfRangeException的原因。抛出异常时,抛出该异常。

似乎就像你想在构造函数中设置Day last 一样:

public Date(int day, int month, int year)
{
    Year = year;
    Month = month;
    Day = day;
}

虽然您的值之间存在如此多的隐藏依赖关系,但也应该在更高的逻辑级别上解决。

答案 1 :(得分:5)

在你的构造函数中:

public Date(int day, int month, int year) {
  Day = day;
  Month = month;
  Year = year;
}

您首先分配了Day属性。此时Month将默认初始化 - 为零 - 但Day setter中的检查假设Month已设置。因此,月份值中的日期将为0。

您需要重新考虑如何执行此操作。可能更好的是不使用自动属性,因此您可以设置字段,然后验证整个日期。

将setter和验证保存到外部接口。

更好的做法是使其成为一种可模拟的值类型。

最好不要重新发明轮子(除非你有非常good reason)。

答案 2 :(得分:-2)

在分配之前使用_month的

Date构造函数。在白天分配前一个月。您需要更改Date构造函数,如下所示。

public Date(int day, int month, int year)
{
   Month = month;             
   Day = day;
   Year = year;
}