2017-06-20 4 views
-1

カレンダーを元に戻すことができないため、カレンダーをリセットしようとすると問題が発生します。 私は何が間違っていますか?Javaでカレンダーをリセットしようとしています

結果である
public static void main(String[] args) { 
    Calendar from = Calendar.getInstance(); 
    int contador = 0; 
    while (contador < 30) { 
     Calendar cal = from; 
     for (int i = 0; i < 3; i++) { 
     cal.add(Calendar.DAY_OF_YEAR, +1); 
     System.out.println("Dia: " + String.valueOf(cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + 1) + "/" + cal.get(Calendar.DAY_OF_MONTH))); 
     } 
     contador++; 
    } 
} 

:あなたはCalendar cal = fromCalendar fromのコピーを行っていないので

Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/24 
Dia: 2017/6/25 
Dia: 2017/6/26 
Dia: 2017/6/27 
Dia: 2017/6/28 
Dia: 2017/6/29 
Dia: 2017/6/30 
...... 
+0

それはしていません本当にあなたとは何か関係がありますが、最近は古い古いCalendarクラスを使うべきではありません。現代の「LocalDate」を好む。より多くのプログラマーにやさしい作業がはるかに良いです。また、コードを少しシンプルにします。また、1日追加するたびに新しいオブジェクトを作成する必要があるため、問題が解消されます。 –

+1

あなたはどこでカレンダーをリセットしたと思いますか? – Tom

答えて

2

。したがって、calを更新すると、その2つが同じインスタンスであるため、fromも更新されます。

が必要なたびにCalendar.getInstance()と電話するだけです。

Calendar cal = Calendar.getInstace(); 

としてオレV.Vは、このコードがちょうどmidnigh前に、あなたはCalendar.getInstance()と異なる「日付」値を得ることができます実行している場合は、奇妙な振る舞いを持つことができ、コメントで述べています。これが、いくつかのリスクとしてのこの解決策です。

これを防ぐには、clone()のインスタンスCalendarCloneableを実装します。これにより、正確に同じ日付と時刻を使用することが保証されます。これは、正確な引数で新しいインスタンスを再作成するためです。

Calendar cal = (Calendar) from.clone(); 
+0

真夜中にコードを実行すると、毎回新しい 'Calendar'インスタンスを得ることは驚くべき結果をもたらします。 –

+1

@ OleV.V。それはまさに私が同じ時間を使うことを保証するために 'cloneable'インターフェースを続ける理由です、なぜ説明するべきか)(私はそのバグを一度も持っていましたが、今は決して忘れないでしょう)) – AxelH

+0

あなたは説明しましたそれを少し明確にするために、私のコメントは余分だったかもしれない)。そのバグを報告してくれてありがとう、私たちはすべてそれから学ぶことができると信じています。 –

1

The answer by AxelHが正しい。私はあなたの目的のために現代階級LocalDateの使用を示すためにこの答えを掲示しています。より優れた設計のAPIのため、問題が簡単に自動的に解決されるため、ほとんどの場合、現代のクラスは一般的に作業しやすく、プログラマーにはフレンドリーなので、誰も長い旧式のCalendarクラスを使用する必要はありません。

出力が行く
private static DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu/M/d"); 

public static void main(String[] args) { 
    // give explicit time zone 
    LocalDate from = LocalDate.now(ZoneId.systemDefault()); 
    int contador = 0; 
    while (contador < 30) { 
     LocalDate cal = from; 
     for (int i = 0; i < 3; i++) { 
      cal = cal.plusDays(1); 
      System.out.println("Dia: " + cal.format(dateFormatter)); 
     } 
     contador++; 
    } 
} 

Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/21 
Dia: 2017/6/22 
Dia: 2017/6/23 
Dia: 2017/6/21 
… 

どんなに古いか新しいクラスを使用している場合、私は今日を取得する読者のためにそれを明確にするために、示すように、明示的なタイムゾーンを与えるお勧めします日付はタイムゾーンに依存する操作です。

あなたは出力のハイフンの代わりにスラッシュと一緒に暮らすことができる場合は、あなたがdateFormatterの使用をドロップすることができ、ちょうどこのように印刷するには:

  System.out.println("Dia: " + cal); 

出力:

Dia: 2017-06-21 
Dia: 2017-06-22 
… 
関連する問題