Javaカレンダー設定が誤って設定されています
-
15-10-2019 - |
質問
Javaのカレンダーに問題があります。 TXTファイルからいくつかのデータを解析しているので、日付を作成する必要があります。次のコードが完了した後:
tmpYear = Double.parseDouble(row[yearIndex]);
tmpMonth = Double.parseDouble(row[monthIndex]);
tmpDay = Double.parseDouble(row[dayIndex]);
if(timeIndex != -1)
tmpTime = Double.parseDouble(row[timeIndex]);
if(secondsIndex != -1)
tmpSeconds = Double.parseDouble(row[secondsIndex]);
変数が次のとおりであることをデバッグして確認できます:tmpyear == 2010
tmpmonth == 12
tmpday == 30
tmptime == 15(これはその日の時間です)
tmpseconds == 0
ただし、次のコードを実行するとき:
cal.set((int)tmpYear,(int)tmpMonth,(int)tmpDay,(int)tmpTime,
(int)((tmpTime - (int)tmpTime)*100),(int)tmpSeconds);
System.out.println(cal.getTime().toString());
私はこれを出力のために取得しています:
日曜日1月30日15:00:00 CST 2011
誰かがこれが何であるかを説明できますか?助けてくれてありがとう!
解決
月は1-12ではなく0-11インデックスが付けられています。
0 = 1月
1 = 2月
...
11 = 12月
使用する tmpMonth = value -1
代わりは。
他のヒント
月の値は1ではなく0から始まると思うので、1月1日、2月1日、そして1月が12として解釈されます。
APIから:
月 - 月数フィールドを設定するために使用される値。月の値は0ベースです。たとえば、1月の0。
Calendar.Monthフィールドを設定すると、ゼロベースになります。 {1月= 0 ... 12月= 11}
理由は非常に簡単です。カレンダーAPIの設計障害。そのため、JSR 310が日付のJavaサポートを改善するために進行中です。
技術的には、クラスの著者は、静的フィールドのみを使用するのは良いことだと考えました。したがって、あなたがする必要があるのは、以下を使用することです。
calendar = ...
calendar.setMonth(Calendar.JANUARY);
彼らは、あなたが必要とするように、人々がカレンダーにダイナミックな設定を必要とするかもしれないとは考えていませんでした(そして、私たちのほとんどは、その問題のために)。
月の値は0(1月)から11(12月)になります。 12月を獲得するために月を設定するときに((int)tmpmonth)-1を使用してみてください。