检查有效日期

本文关键字:有效日期 检查 | 更新日期: 2023-09-27 18:35:21

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

这是我目前得到的:

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

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

提前致谢

检查有效日期

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

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

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

根据文档,如果出现以下情况,则会发生ArgumentOutOfRangeException

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

或者,可以从DateTime类复制逻辑:(参考)

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

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

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

试试这个:

public void setBirthdate(int year, int month, int day)
{
    try
    {
        Birthdate = new DateTime(year, month, day);
    }
    catch (Exception ex)
    {
        Birthdate = DateTime.Now;
    }
} 
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;
  }
 }

Grant Winney的代码第二部分有一个错误。交换 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);
    }