Java:自定义向当前日期添加1个月

时间:2013-03-26 04:02:45

标签: java date

我已经阅读过并且基本上我已经发现Calendar对象能够通过使用类似的东西将日期添加1个月:

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

虽然每当日期在30或31时我都不喜欢它的行为。如果我将1个月添加到2012年1月31日,则输出将变为02/29/2012。当我再加1​​个月时,它就变成了03/29/2012。

无论如何我可以强制02/29/2012自动成为03/01/2012吗?

基本上这就是我想要发生的事情:

默认日期:01/31/2012

添加1个月:03/01/2012

再加1个月:03/31/2012

3 个答案:

答案 0 :(得分:3)

您要求的是一些隐含的知识,如果开始日期是该月的最后一天,并且您添加1个月,则结果应该是下个月的最后一天。即财产“最后一天”应该是粘性的。

这不是Java Calendar中直接提供的,但一种可能的解决方案是使用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() { ... }

封装操作。

答案 1 :(得分: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());
}

如果天数= 30,则会在30天后返回您的日期。

答案 2 :(得分: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);
}