0

日付に月を足したい...

しかし、元の日付を変更せずに、結果を新しい変数に代入したいと考えています。Calendar.add() を使用しているように見える標準的な方法でこれを行いたいのですが、その方法は計算に使用される Calendar オブジェクトを変更します。

だから私はここで「適切な」ことは何だろうと思っています - Object.clone() を使用してカレンダーにキャストする必要がありますか? 本能的に、これは少し恐ろしく間違っているように思えます。または、次のような構文を使用して、元のオブジェクトから新しい Calendar オブジェクトを作成する必要があります。

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

かなりひどいようにも思えます...確かにもっと簡単な方法があるに違いありません-何かが足りないと誰か教えてください!

(...しかし、Joda Time や Java 8 を使用するように言わないでください。プロジェクトの制約により使用できません。)

4

5 に答える 5

3

カレンダーはきれいなライブラリではないので、期待してはいけません。

AFAIK、Java 8には、JodaTimeに基づく新しい日付/時刻ライブラリがあります。;)

JodaTimeを使用するように言わないでください-プロジェクトの制約のために使用できません

その場合は、カレンダーとその癖の使い方を学ぶだけです。

于 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 を使用できず、標準の Date/Calendar 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 に答える