0

我想在日期上加一个月...

但我想在不更改原始日期的情况下将结果分配给一个新变量。我想以标准方式执行此操作,这似乎是使用 Calendar.add() 但该方法更改了用于计算的 Calendar 对象。

所以我想知道这里“正确”的做法是什么——我应该使用 Object.clone() 并转换回日历吗?本能地这似乎有点可怕和错误。或者,我应该使用如下语法从原始对象创建一个新的日历对象:

Calendar newCalendar = Calendar.getInstance();
newCalendar.setTime(originalCalendar.getTime());

看起来也很可怕......肯定有一个更简单的方法 - 请有人告诉我我错过了一些东西!

(......但请不要告诉我使用 Joda Time 或 Java 8 - 由于项目限制,我不能。)

4

5 回答 5

3

日历不是一个漂亮的库,所以你不应该期望它是。

AFAIK,Java 8 将有一个基于 JodaTime 的新日期/时间库。;)

请不要告诉我使用 Joda Time - 由于项目限制,我不能

在这种情况下,只需学会享受使用日历及其怪癖。

于 2012-12-12T14:36:39.563 回答
1

如果它可以帮助任何人或任何人有任何评论,这是我最终得到的代码:

/**
 * Get a new date/time by adding the specified number at the specified granularity
 * (day/weeks/months etc.) to a date/time.
 * @param dateTime
 *            Date/time to add to
 * @param field
 *            The calendar field representing granularity (day/weeks/months etc.)
 * @param amount
 *            Amount to be added
 * @return A new date/time from performing the calculation
 */
public static Calendar add(final Calendar dateTime, final int field, final int amount) {
    // Clone the date/time so the original one isn't changed
    Calendar newDateTime = Calendar.getInstance();
    Date dateTimeAsMillis = dateTime.getTime();
    newDateTime.setTime(dateTimeAsMillis);

    // Add the specified amount at the specified granularity
    newDateTime.add(field, amount);

    return newDateTime;
}
于 2012-12-18T13:32:53.267 回答
0

出什么问题了

Calendar resultCalendar = originalCalendar.clone(); // Or any other way of creating a copy
resultCalendar.add(...);

?

于 2012-12-12T14:39:06.727 回答
0

如果您不能使用 Joda-Time 并且仅限于标准日期/日历 API,那么我会建议以下内容:

Calendar calendar = Calendar.getInstance();
Date originalDate = calendar.getTime();

calendar.add(Calendar.MONTH, 1);
Date newDate = calendar.getTime();

calendar.setTime(originalDate);

这将备份您当前的日期,然后使用日历计算当前日期 + 1 个月,然后将原始设置恢复到日历。

于 2012-12-12T14:42:49.167 回答
0

如果你真的不想克隆一个新的日历对象,你可能会检索当月有多少天,然后计算需要跨度到下个月的时间。

这时候你可以 setTime(currentCalendar.getTime() + spanTime);

于 2012-12-12T14:46:17.907 回答