检查有效日期

时间:2014-12-27 18:45:46

标签: c# date datetime

所以我试图弄清楚是否有另一种方法来检查日期是否有效。因此,我们的想法是,如果日期有效,则继续使用给定日期,如果日期无效则使用今天的日期。

这就是我现在所得到的:

        public void setBirthdate(int year, int month, int day)
        {
        if (month < 1 || month > 12 || day < 1 || day > DateTime.DaysInMonth(year, month))
        {
            Birthdate = DateTime.Today;
        }
        else
            Birthdate = new DateTime(year, month, day);
        }   

那么有没有更短/更易读的方法呢?

提前致谢

5 个答案:

答案 0 :(得分:5)

可以使用这些值来尝试构建有效的DateTime,然后捕获在参数超出范围时发生的ArgumentOutOfRangeException

public void setBirthdate(int year, int month, int day)
{
    try
    {
        Birthdate = new DateTime(year, month, day);
    }
    catch (ArgumentOutOfRangeException)
    {
        Birthdate = DateTime.Today;
    }
}

有些人可能不同意使用这样的例外,但我只是让DateTime类做自己的检查,而不是自己重新创建它们。

documentation开始,如果出现ArgumentOutOfRangeException

  • 年份小于1或大于9999,或
  • 月份小于1或大于12,或
  • 日期小于1或大于月份的天数。

或者,您可以复制DateTime课程中的逻辑:reference

public void setBirthdate(int year, int month, int day)
{
    if (year >= 1 && year <= 9999 && month >= 1 && month <= 12)
    {
        int[] days = DateTime.IsLeapYear(year)
            ? new[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365}
            : new[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};

        if (day >= 1 && day <= days[month] - days[month - 1])
            Birthdate = new DateTime(year, month, day);
    }
    else
        Birthdate = DateTime.Today;
}

答案 1 :(得分:2)

我会使用TryParseMSDN)方法而不是异常捕获(如果频繁使用无效值调用,则可能是高开销):

DateTime date;
if (DateTime.TryParse(string.Format("{0}-{1}-{2}", year, month, day), out date))
{
    // Date was valid.
    // date variable now contains a value.
}
else
{
    // Date is not valid, default to today.
    date = DateTime.Today;
}

答案 2 :(得分:1)

试试这个:

public void setBirthdate(int year, int month, int day)
{
    try
    {
        Birthdate = new DateTime(year, month, day);
    }
    catch (Exception ex)
    {
        Birthdate = DateTime.Now;
    }
} 

答案 3 :(得分:0)

protected DateTime CheckDate(String date)
{
  DateTime dt;
 try{
    dt = DateTime.Parse(date);

 }catch(Exception ex){
    dt = DateTime.now();
    // may raise an exception
}
  finally{
      return dt;
  }
 }

答案 4 :(得分:0)

格兰特·温尼的代码第二部分有一个错误。 IsLeapYear检查后的分配被交换。正确的代码:

        public static bool IsValidYearMonthDay(int year, int month, int day)
    {
        if (year >= 1 && year <= 9999 && month >= 1 && month <= 12)
        {
            int[] days = DateTime.IsLeapYear(year)
                ? new[] { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366 }
                : new[] { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 };

            if (day >= 1 && day <= days[month] - days[month - 1])
            {
                return true;
            }
        }

        return false;
    }

测试:

    [TestCase(2019, 10,21,true)]
    [TestCase(2019, 11, 31, false)] //november doesnt have 31, only 30
    [TestCase(2016, 2, 29, true)] // is leap
    [TestCase(2014, 2, 29, false)] // is nop leap
    public static void ValidateYearMonthDay(int year, int month, int day, bool expectedresult)
    {
        var result = Date.IsValidYearMonthDay(year, month, day);
        Assert.AreEqual(expectedresult, result);
    }