繁体   English   中英

如何将 Calendar.add() 结果分配给新的 Calendar 对象(在 Java 7 中)?

[英]How to assign Calendar.add() result to a new Calendar object (in Java 7)?

我想在日期中添加一个月...

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

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

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

看起来也很可怕......当然必须有一种更简单的方法 - 请有人告诉我我错过了什么!

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

Calendar 不是一个漂亮的库,因此您不应该期望它如此。

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

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

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

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

/**
 * 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;
}

出什么问题了

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

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

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

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

calendar.setTime(originalDate);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM