4

次のコードで動作を理解しようとしています。私のローカルタイムゾーンはUTC-7(アリゾナ)です。

Calendar cal = Calendar.getInstance();
cal.set(Calendar.MINUTE,40);
cal.set(Calendar.AM_PM,Calendar.PM);
System.out.println("1 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("1 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("1 UTC -7 Time Stamp:" + cal.getTime().toString());
cal.set(Calendar.HOUR,12);
System.out.println("2 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("2 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("2 UTC -7 Time Stamp:" + cal.getTime().toString());
cal.setTimeZone(TimeZone.getTimeZone("America/New_York")); //set time zone to UTC -4
System.out.println("3 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("3 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("3 UTC -7 Time Stamp:" + cal.getTime().toString());
cal.set(Calendar.HOUR,12);
System.out.println("4 UTC -4 Hour:" + cal.get(Calendar.HOUR_OF_DAY));
System.out.println("4 UTC -4 Day:" + cal.get(Calendar.DAY_OF_MONTH));
System.out.println("4 UTC -7 Time Stamp:" + cal.getTime().toString());

次の出力を生成します。

1 UTC -4時間:12
1 UTC -4日:27
1 UTC -7タイムスタンプ:火9月27日12:40:37 MST 2011
2 UTC -4時間:0
2 UTC -4日:28 2UTC-
7時間スタンプ:Wed Sep 28 00:40:37 MST 2011
3 UTC -4 Hour:3
3 UTC -4 Day:28
3 UTC -7 Time Stamp:Wed Sep 28 00:40:37 MST 2011
4 UTC -4 Hour:12
4 UTC -4日:28
4 UTC -7タイムスタンプ:水9月28日09:40:37 MST 2011

私が理解していないのは、最初のcal.set(Calendar.HOUR、12)によって日付が翌日に反転する理由です。1つの値にadd()を使用すると、他の値が調整されることは理にかなっていますが、set()がそれを行うことも意味がありません。

他のすべての値が保持される絶対set()を実行する方法はありますか?

4

1 に答える 1

6

「HOUR_OF_DAY」ではなく「HOUR」を設定しています。したがって、「午後の開始から 12 時間後」に設定されます。つまり、その日の終わりの真夜中なので、次の開始になります。「私はPMであることを意味しているので、時間を設定することは」と言っていると考えてくださいmidday + hours * 12

個人的には、それはまだ少し奇妙な動作だと思いますが、代わりに HOUR_OF_DAY を使用することに固執します...または、できれば最初にJoda Timeを使用します。

于 2011-09-27T19:28:21.720 に答える