Java: 自定义在当前日期上加1个月

3

我已经阅读了相关资料,基本上我发现日历对象可以通过以下方式将1个月添加到指定的日期:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);

尽管我不喜欢在日期为30或31的情况下的行为。如果我将01/31/2012加上1个月,则输出变为02/29/2012。当我再加1个月时,则变为03/29/2012。
有没有办法强制02/29/2012自动变成03/01/2012?
基本上,这就是我想要发生的事情:
默认日期:01/31/2012
加上1个月:03/01/2012
再加1个月:03/31/2012。

1
看起来你想要的实际上是添加30天? - radai
我猜你想要加上30/31天,而不是一个月。但你必须考虑到,并非所有的月份都有相同数量的天数,Calendar可以很好地处理这个问题。 - Rahul
我并不想添加固定数量的天数,正如你所说,每个月的天数都不同。也许我应该编写自己的类? - mpmp
3个回答

3
您所询问的是一些隐含的知识,即如果起始日期是月底,加上1个月后,结果应为下个月的月底。即属性“last-day-of-month”应为粘性。
这在Java的日历中不是直接可用的,但一个可能的解决方案是在增加月份后使用Calendar.getActualMaximum(Calendar.DAY_OF_MONTH)重置天数。
Calendar cal = ...;
cal.add(Calendar.MONTH,1);
cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DAY_OF_MONTH));

你甚至可以继承GregorianCalendar并添加一个方法。
public Calendar endOfNextMonth() { ... }

封装操作。

3

要添加30天,您可以这样做:

public static java.sql.Date sumarFechasDias(java.sql.Date fch, int days) {
    Calendar cal = new GregorianCalendar();
    cal.setTimeInMillis(fch.getTime());
    cal.add(Calendar.DATE, days);
    return new java.sql.Date(cal.getTimeInMillis());
}

如果days=30,它将返回添加了30天的日期。


0

看起来您希望日历在下个月的日期小于上个月的日期时滚动到下个月的开头。以下是我们的实现方法:

Calendar cal = Calendar.getInstance();
int oldDay = cal.get(DAY_OF_MONTH);
cal.add(Calendar.MONTH, 1);

// If the old DAY_OF_MONTH was larger than our new one, then
// roll over to the beginning of the next month.
if(oldDay > cal.get(DAY_OF_MONTH){
  cal.add(Calendar.MONTH, 1);
  cal.set(Calendar.DAY, 1);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接