Вопрос о java.util.Calendar - PullRequest
       44

Вопрос о java.util.Calendar

4 голосов
/ 27 сентября 2011

Я пытаюсь понять поведение с помощью следующего кода.Мой местный часовой пояс - 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. Штамп времени: вторник, 27 сентября. 12:40:37 MST 2011
2 UTC -4 час.: 0
2 UTC -4. День: 28
2 UTC -7 время.Штамп: ср 28 сен 00:40:37 MST 2011
3 UTC -4 час: 3
3 UTC -4 день: 28
3 UTC -7 штамп времени: ср 28 сен 00 00:40:37MST 2011
4 UTC -4 Час: 12
4 UTC -4 День: 28
4 UTC -7 Отметка времени: среда, 28 сентября 09:40:37 MST 2011

Я не понимаю, почему первый набор параметров cal.set (Calendar.HOUR, 12) приводит к смене даты на следующий день.Имеет смысл, что использование add () для одного значения приведет к корректировке других значений, но для set () это также не имеет смысла.

Есть ли способ сделать абсолютный набор (), где все остальные значения сохраняются?

1 Ответ

6 голосов
/ 27 сентября 2011

Вы устанавливаете "HOUR", а не "HOUR_OF_DAY". Поэтому он устанавливает «12 часов после начала дня» - то есть полночь в конец того дня, так что начало следующего. Думайте об этом как о: «Я должен быть в личку, поэтому установка часа midday + hours * 12»

Лично я думаю, что это все еще немного странное поведение, но я бы предпочел вместо этого использовать HOUR_OF_DAY ... или, что предпочтительнее, использовать Joda Time в первую очередь.

...