检查有效日期
本文关键字:有效日期 检查 | 更新日期: 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);
}