所以我试图弄清楚是否有另一种方法来检查日期是否有效。因此,我们的想法是,如果日期有效,则继续使用给定日期,如果日期无效则使用今天的日期。
这就是我现在所得到的:
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);
}
那么有没有更短/更易读的方法呢?
提前致谢
答案 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
:
或者,您可以复制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)
我会使用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;
}
答案 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);
}