试图写我自己的日期程序,需要在c#中检查指定月份的最大日期
本文关键字:日期 检查 我自己 自己的 程序 | 更新日期: 2023-09-27 18:18:25
我试图用c#编写自己的日期程序,我遇到的问题是,当用户输入日期时,例如2-31,程序允许它。我想创建一个条件,让我可以匹配输入的月份,然后从中查看该月的日期是否可用。我正在使用下面的代码,但它给我抛出了任何一天的异常,比如10月10日,这应该是正确的。如果我把这个注释掉,日期可以工作,但它不会检查是否与月份匹配。
public int Day
{
get
{
return day;
}
private set
{
//int[] daysPerMonth = { 0, 31, 28, 31, 30, 31, 30,
// 31, 31, 30, 31, 30, 31 };
//// check if day in range for month
//if (value > 0 && value <= daysPerMonth[Month])
// day = value;
//else // day is invalid
// throw new ArgumentOutOfRangeException(
// "Day", value, "Day out of range for current month/year");
if (value > 0 && value <= 31)
day = value;
else
throw new ArgumentOutOfRangeException("Day", value, "Day must be 1-31");
}
}
您必须知道用户选择的月份以及年份(以正确处理闰年)。
应该是这样的:
public int Day
{
get
{
return day;
}
private set
{
var endOfMonth = new DateTime(year, month, 1).AddMonths(1).AddDays(-1);
if (value > 0 && value <= endOfMonth.Day)
day = value;
else
{
var message = string.Format("Day must be between {0} and {1}", 1 endOfMonth.Day);
throw new ArgumentOutOfRangeException("Day", value, message);
}
}
}
其中year
和month
是您类中的其他字段。如果你真的想在没有任何引用DateTime
类的情况下做到这一点,我建议将这个逻辑提取到一个静态类中,它可以在你想要得到这个月的最后一天的任何时候进行数学计算,而不必重新编码。
public static class DateHelper
{
private int[] daysInMonth = new[] { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
public static bool IsLeapYear(int year)
{
// TODO: taken from wikipedia, can be improved
if (year % 400 == 0)
return true;
else if (year % 100 == 0)
return false;
else if (year % 4 == 0)
return true;
return false;
}
public static bool GetDaysInMonth(int year, int month)
{
// TODO: check for valid ranges
var days = daysInMonth[month - 1];
if (month == 2 && IsLeapYear(year))
days++;
return days;
}
}
那么你可以这样使用:
public int Day
{
get
{
return day;
}
private set
{
var endOfMonth = DateHelper.GetDaysInMonth(year, month);
if (value > 0 && value <= endOfMonth)
day = value;
else
{
var message = string.Format("Day must be between {0} and {1}", 1 endOfMonth);
throw new ArgumentOutOfRangeException("Day", value, message);
}
}
}
如果必须使用DateTime则可以使用
DateTime.DaysInMonth(Year, Month);
具有