3

2 つの日付をミリ秒に変換したいのですが、与えられた結果が間違っています。コードに何か問題がありますか?それ以外の場合の解決方法...

GregorianCalendar c1 = new GregorianCalendar();
GregorianCalendar c2 = new GregorianCalendar();

c1.set(2013, 01, 31, 16, 44, 49);
c2.set(2013, 02, 01, 12, 59, 55);

System.out.println("c1 = "+c1.getTimeInMillis()+"\nc2 = "+ c2.getTimeInMillis());

output:
c1 = 1362300289619
c2 = 1362113995619

時間を計算すると、次の結果が得られます0Month -2Day -3Hour -44Min -54Sec 。これは間違っています。そして、次のようなものでなければなりません: 0Month 0Day 20Hour 15Min 6Sec.

c1 は c2 よりも大きいため、間違った結果が得られますが、c1 が c2 よりも大きくなったのはなぜですか。このような場合、2 つの日付間の時間を計算することはできません。誰かが私を助けてください知っているなら、事前に感謝します。

4

4 に答える 4

7

月は 0 から始まるため、この例では、c1 は 2 月 31 日であり、これは 3 月 3 日 (2 月は 28 日のみ) と解釈され、c2 は 3 月 1 日です。

于 2013-02-01T11:29:23.160 に答える
5

このコード:

c1.set(2013, 01, 31, 16, 44, 49);

Java の月は 0 から始まるため、 2 月31 日を設定しようとしています。2 月 28 日から 3 日後の 3 月 3 日で終わるのではないかと思います。それは明らかに 3 月 1 日以降であり、これc2が設定されています。

のドキュメントからCalendar.set

month - MONTH カレンダー フィールドの設定に使用される値。月の値は 0 ベースです。たとえば、1 月は 0 です。

コードの動作がおかしくなっている場合は、100% 確信が持てない API 呼び出しの詳細を常に確認してください。

別の方法として、可能であれば Joda Timeを使用することを強くお勧めします。Joda Timeはより健全な API です。

于 2013-02-01T11:29:32.693 に答える
1

お返事ありがとうございます!Javaで月がゼロから始まることを知らない前に、月から1を引くだけで、問題は解決しました...これが解決方法です

c1.set(2013、(01-1)、31、16、44、49);
c2.set(2013、(02-1)、01、12、59、55);

代わりに、クラスの定数を使用してjava.util.Calendar、コードを読みやすくすることができます。

c1.set(2013, Calendar.JANUARY, 31, 16, 44, 49);
c2.set(2013, Calendar.FEBRUARY, 01, 12, 59, 55);
于 2013-02-01T16:24:21.207 に答える
0

お返事ありがとうございます!Javaで月がゼロから始まることを知らない前に、月から1を引くだけで、問題は解決しました...これが解決方法です。

c1.set(2013, (01-1), 31, 16, 44, 49);
c2.set(2013, (02-1), 01, 12, 59, 55);
于 2013-02-01T13:35:22.850 に答える