如果两个日期是一个月,则告诉

时间:2014-05-26 05:38:29

标签: java calendar

我对这个程序有一些小问题。我假设在两个日期之间相隔一个月是30天。该程序适用于所有测试日期,除了调用monthApart(2,14,3,15),它返回false而不是true。任何帮助将不胜感激,谢谢。

该程序应该判断两个日期是否相隔一个月。假设用户输入有效的月和日。编写一个名为monthApart的方法,该方法接受表示两个日历日期的四个整数参数。每个日期包括一个月(1到12)和一天(1到那个月的天数[28-31])。该方法返回日期是否至少相隔一个月。假设此问题中的所有日期都发生在同一年。例如,

  

以下日期均被认为至少相隔一个月   9月19日(9月19日):2 / 14,7 / 25,8 / 2,8 / 19,10 / 19,10 / 20和11/5。

     

以下日期与9/19:9/20相比至少不是一个月,   9 / 28,10 / 1,1 / 15和10/18。

请注意,第一个日期可能在第二个日期之前或之后(或与之相同)。假设传递的所有参数值都是有效的。

问题的答案:          致电:答案:结果:

1 monthApart(6,14,9,21)true true

2 monthApart(4,5,5,15)true true

3 monthApart(4,15,5,15)true true

4 monthApart(4,16,5,15)false false

5个月(6,14,6,8)假错误

6个月(7,7,6,8)假错误

7 monthApart(7,8,6,8)true true

8 monthApart(10,14,7,15)true true

9 monthApart(2,14,3,15)true false

10 monthApart(1,1,12,31)true true

示例电话:

  

呼叫返回因为monthApart(6,14,9,21)6月14日是真的   至少在9月21日前一个月

     

monthApart(4,5,5,15)真4月5日是至少一个月前   5月15日

     

monthApart(4,15,5,15)4月15日至少是一个月之前   5月15日

     

monthApart(4,16,5,15)假4月16日不是至少一个月   5月15日之前

     

monthApart(6,14,6,8)假6月14日至少不是一个月   除了6月8日之外

     

monthApart(7,7,6,8)假7月7日至少相隔一个月   从6月8日起。

     

monthApart(7,8,6,8)7月8日至少是6月之后的一个月   第八

     

monthApart(10,14,7,15)真10月14日是至少一个月   7月15日之后

我的代码现在很乱;我稍后会清理它。

public static boolean monthApart(int monthOne, int dayOne, int monthTwo, int dayTwo){
    int monthDays = -1; 
    int monthMin = Math.min(monthOne, monthTwo); // Gets the lesser month

    if (monthOne<1 || monthOne >12 || monthTwo>12 || monthOne<1) { // If not a possible month
        throw new IllegalArgumentException("Out of range");
    }

    switch(monthMin) { // Gets the corresponding last day of month
        case 1:
            monthDays = 31;
            break;
        case 2:
            monthDays = 28;
            break;
        case 3:
            monthDays = 31;
            break;
        case 4:
            monthDays = 30;
            break;
        case 5:
            monthDays = 31;
            break;
        case 6:
            monthDays = 30;
            break;
        case 7:
            monthDays = 31;
            break;
        case 8: 
            monthDays = 31;
            break;
        case 9:
            monthDays = 30;
            break;
        case 10:
            monthDays = 31;
            break;
        case 11:
            monthDays = 30;
            break;
        case 12:
            monthDays = 31;
            break;
    }

    int dayFirst = -1; // Plan: Last day of month-day of lower month + days on next month
    int daySecond = -1;
    if (monthOne<monthTwo) {
        dayFirst = dayOne;
        daySecond = dayTwo;
    } else if (monthOne>monthTwo) {
        dayFirst = dayTwo;
        daySecond = dayOne;
    }

    if (Math.abs(monthOne-monthTwo)>1) { // More than a month apart
        return true;
    } else if (monthOne==monthTwo) { // Same month
        return false;
    } else if (Math.abs(monthOne-monthTwo)==1) { // Adjacent months

        if (((monthDays-dayFirst) + daySecond) < 30 ) { // Gets difference in days
            return false;
        } else {
            return true;
        }
    }
    return false;
}

2 个答案:

答案 0 :(得分:0)

您可能需要检查if (((monthDays-dayFirst) + daySecond) < 30 )部分代码。 实际上,您可以通过替换值来查看此比较是否正确。

致电monthApart(2, 14, 3, 15)会使monthDays为28,dayFirst至14,daySecond至15.因此,将比较设为28 - 14 + 15&lt; 30,这是真的。

我假设您错误地计算了上述计算中的开始日期。 (即从1月1日到1月31日的总天数是31-1 + 1 = 31天,而不是31-1 = 30天。)

答案 1 :(得分:0)

我明白了。而不是假设一个&#34;月分开&#34;是30天,它应该是那个月的天数。

    if (((monthDays-dayFirst) + daySecond) < 30 ) { // Gets difference in days
        return false;
    } else {
        return true;
    }

应该......

    if (((monthDays-dayFirst) + daySecond) < monthDays) { // Gets difference in days
        return false;
    } else {
        return true;
    }