我必须创建自己的日历类(我知道一个存在,但我们正在我们的类创建技能上进行测试,所以我不能使用现有日历类中的任何现有方法)。 我们必须提供的方法之一是能够将日历日期向前或向后滚动给定的月份。
首先,我的Calendar对象的构造函数需要一个日,月和年值。然后验证这些值(例如,确保给定天数在给定月份的天数内,确保月份在1到12之间)。
现在,对于回滚方法,我写了这个:
public void rollMonths(int m) {
if(month + m > 12){ // Checks if the given months plus the current month will need to increase the year
year = year + 1; // Increases the year by one if it goes over.
month = m - (12 - month); } // Finds the number of months till the end of the year, and subtracts this from the given months. Then sets the month to the new value.
else if(month + m < 0) { // Checks if the year will need to be decreased.
year = year - 1; // Decreases the year by 1;
month = 12 - (Math.abs(m) - month); } // Finds the months between the start of the year and the current month, and subtracts this from the given month value. Then sets the month to this value.
else
month = month + m; // If current month plus given months is within the same year, adds given months to current month.
}
此方法有效,但仅限日历不会增加一年以上。例如,如果我有一个2011年8月的日历,并且我向前滚动了6个月,我正确地获得了2012年2月。但是,如果我尝试前进20个月,那么月份将变为16 .. 同样地,当我试图回滚给定的月份时。我在一年内回滚时得到了正确答案。
对不起,如果这似乎没有意义,我不太清楚如何解释它。如果它不让我知道,我会尝试写一个更好的解释。
答案 0 :(得分:3)
显然是家庭作业,所以我只是指出这个缺陷......
这是你的问题
if(month + m > 12){ // Checks if the given months plus the current month will need to increase the year
year = year + 1; // Increases the year by one if it goes over.
month = m - (12 - month); }
无论我们添加了多少个月,你的年仅增加1
年,它可能是20,40或其他......
年数会增加m/12
,而减去年数后剩下的数字会增加数月。
提示:您需要使用Mod
运算符。
答案 1 :(得分:1)
首先,您可以使用Calendar的实现,例如GregorianCalendar。
您需要一个循环来保持月份号有效。像这样:
month += m;
while(month < 1){
month += 12;
year -= 1;
}
while(month > 12){
month -= 12;
year += 1;
}
或者,您可以一次性完成:
month += m;
if(month < 1)
year -=1;
if(month > 12 || month < 1){
month = month % 12 + 1;
year += month / 12;
}