web-dev-qa-db-ja.com

Androidでカレンダーに日を追加すると、31日に失敗します

現在、日付が5月28日であると想定します。次のコマンドを順番に呼び出すと、出力は次のようになります。

cal.add(Calendar.DATE, 1);  // Day = 29
cal.add(Calendar.DATE, 1);  // Day = 30
cal.add(Calendar.DATE, 1);  // Day = 31
cal.add(Calendar.DATE, 1);  // Day = 31
cal.add(Calendar.DATE, -1); // Day = 29

なぜこれは来月に飛び込まないのですか?そして、なぜそれは31日にスタックしているのですか(しかし、マイナス1にすると、29にジャンプします)?

17
dinesh707

Calendar.DATEフィールドに1を追加すると、月末に達したときに月もインクリメントする必要があるため(5月の場合は31)、記述しても意味がありません。それをデバッグし、日の値が実際にあなたが思っているものであることを確認してください

15
IncrediApp

あなたは私の友人の2つの簡単な方法でこれを簡単に行うことができます。最初のものは:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, 1);

2つ目は次のとおりです。

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.HOUR_OF_DAY, 24);

このことを見つけたいと思います。ありがとう。

31

これもうまくいくはずです。

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);

あなたはそれが動作することをテストすることができます:

for (int i = 0; i < 365; i++) {
    cal.add(Calendar.DAY_OF_YEAR, 1);
    System.out.println(cal.getTime().toString());
}
2
velval

私は間違っているようです!APIによると、ロールは特定のフィールドのみを更新します!

カレンダーに日を追加する場合は、

cal.roll(Calendar.DATE, 1);

これはオーバーフローすると月と年をインクリメントします

2
reggaemuffin

カレンダーのどの実装を使用していますか?それは他のみんなのために働くように見えるので...

1

これは答えではなく、単なる手がかりです。DSTが日付の間に開始されたときに発生することがわかりました。多分それはあなたの場合です...

例:ブラジルのDSTは、今年「Sun Oct 20 00:00:002013」に開始されました。

Calendar cal = Calendar.getInstance(); // today = Sat Oct 19 00:00:00 BRT 2013
cal.add(Calendar.DATE, 1); // = Sat Oct 19 23:00:00 BRT 2013

残念ながら、私はまだそれを回避する方法を知りません。

0
Christian

確認したところ、正常に追加されました。私のコードとo/pを見てください:

Calendar  cal = Calendar.getInstance(); // today is 09-Aug-2012

for(int i=0;i<23;i++) {
    cal.add(Calendar.DATE, 1);  
}
System.out.println(cal.get(Calendar.DAY_OF_MONTH));

O/p

1

0