if (month > 0 && month <= 12)
if (day > 0 && day <= checkDays(month, year))
if (year >= 1752 || year <= 9999)
if((month != 12 && day != 31 && year != 9999))
return true;
else return false;
else return false;
else return false;
else return false;
我的值为month = 12,days = 31,year = 2008,数据验证在最后一部分失败,但我无法弄清楚原因。
答案 0 :(得分:2)
您的第一年条件在您想要AND时使用OR;你的第二年条件与我怀疑你想要的完全相反。
您还有一个操作订单错误:您无法检查之后验证月份和年份的那一天(假设checkDays
提供的最大值是特定(月,年)对的日期编号;如果是,则应将其重命名为days_in_month
)。
最后,像这样的代码通常更容易阅读,如果写成一系列if-fail-return-false条件而没有任何嵌套。像这样:
// Year range supported is [1752, 9999].
// (Gregorian calendar introduced in 1752 in Great Britain.)
if (year < 1752 || year > 9999)
return false;
// Valid month numbers in [1, 12].
if (month < 1 || month > 12)
return false;
// Valid day numbers in [1, n] where n depends on month and year.
if (day < 1 || day > checkDays(month, year))
return false;
// 9999-12-31 is invalid (used as a sentinel value?)
if (year == 9999 && month == 12 && day == 31)
return false;
return true;
顺便说一句,Long Now人会对你的年上限有所了解。
答案 1 :(得分:2)
我发现用“找到虚假的东西并返回”来写这些东西几乎总是更容易。所以:
if (month < 1 || month > 12) return false;
if (day < 1 || day > 31) return false;
if (year < 1752 || year > 9999) return false;
if (month == 12 && day == 31 && year == 9999) return false;
// If we get here, everything is fine, so return true.
return true;
当然,你应该根据它是哪个月来检查day
:
int daysInMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (month < 1 || month > 12) return false; // Must do this before checking day!
int daysThisMonth = daysInMonth[month];
// Check for leapyear.
if (month == 2 && year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
{
daysThisMonth = 29;
}
if (month != 2 && day < 1 || day > daysThisMonth) return false;
...
答案 2 :(得分:1)
有点猜测,因为我不太清楚你的功能应该做什么,但是这里有。
month != 12 && day != 31 && year != 9999
仅在月份不是12 且时才返回true 年份不是9999。
因此,对于您的输入,它是:
month != 12 && day != 31 && year != 9999
=> false && false && true
=> false
你不想要:
month != 12 || day != 31 || year != 9999
如果月份不是12 或,则该日期不是31 或年份不是9999,将返回true。
一种等效的,但可能更容易理解的写作方式:
!(month == 12 && day == 31 && year == 9999)
所以“如果月份是12,第31天和9999年,则返回false”。