簡體   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