3

我已经阅读过,基本上我已经发现 Calendar 对象能够将 1 个月添加到使用以下内容指定的日期:

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

尽管我不喜欢它在日期为 30 或 31 时的行为。如果我在 2012 年 1 月 31 日添加 1 个月,输出将变为 2012 年 2 月 29 日。当我再添加 1 个月时,它变为 2012 年 3 月 29 日。

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

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

默认日期:01/31/2012

添加 1 个月:03/01/2012

再增加 1 个月:2012 年 3 月 31 日

4

3 回答 3

3

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

这在 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() { ... }

封装操作。

于 2013-03-26T04:17:27.453 回答
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 天的日期。

于 2013-03-26T11:42:50.383 回答
0

It looks like you want the calendar to roll up to the beginning of the next month if the date of the next month is smaller than the date of the month before it. Here's how we'd do that:

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);
}
于 2013-03-26T04:30:26.897 回答