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

我的值月 = 12、天 = 31 和年 = 2008,最后一部分的数据验证失败,但我不知道为什么。

4

3 回答 3

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;
...
于 2013-09-18T23:31:49.963 回答
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的人想谈谈你的年限。

于 2013-09-18T23:31:01.960 回答
1

有点猜测,因为我不太清楚你的功能应该做什么,但这里有。

month != 12 && day != 31 && year != 9999仅当月份不是 12并且日期不是 31并且年份不是 9999 时才返回 true。

因此,对于您的输入,它是:

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”。

于 2013-09-18T23:28:47.137 回答