Региональные настройки Java и Windows

Извините, если это повторная публикация. Я не нашел подходящего ответа.

Не обращайте внимания на передовые методы и использование устаревших API.

Я хочу отформатировать следующую дату «Пн, 19 мая, 02:16:52 EDT 2003» в «ММ / дд / гггг ЧЧ: мм: сс». Опять же, я хочу изменить только выходной формат, и это выполняется с моего ноутбука, который находится в EST.

Мои региональные настройки Windows:

Текущий часовой пояс: Восточное летнее время

Часовой пояс: (GMT-05: 00) восточное время (США и Канада)

Автоматически настраивать часы для перехода на летнее время: установлен

Этот код Java делает это:

Date aDate = new Date("Mon May 19 02:16:52 EDT 2003");
SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy HH:mm:ss");
System.out.println("Formatted Date: " + sdf.format(aDate));

Выход

Formatted Date: 05/19/2003 02:16:52

Теперь я изменяю настройку Windows на следующую (снимите флажок только с настройки летнего времени)

Текущий часовой пояс: Восточное летнее время

Часовой пояс: (GMT-05: 00) восточное время (США и Канада)

Автоматически настраивать часы для перехода на летнее время: установлен

Выход:

Formatted Date: 05/19/2003 01:16:52

Вопросов:

  1. Почему вывод отключен на час?
  2. Использует ли Java настройки летнего времени Windows даже при форматировании? Я, хотя Java поддерживает свои собственные данные для времени настройки DST для различных часовых поясов.

person user1318311    schedule 25.04.2012    source источник
comment
Да, Java использует настройки ОС, будь то Windows или другая ОС   -  person GETah    schedule 25.04.2012
comment
Но почему Java изменила мой вывод? Я говорю Java, какую дату использовать и в каком формате выводить.   -  person user1318311    schedule 25.04.2012


Ответы (4)


Внутри даты хранятся в виде длинного значения, которое представляет количество миллисекунд, прошедших с некоторой эпохи. Когда вы отключили летнее время на своем компьютере, вы изменили свой часовой пояс. Итак, Java использует один и тот же временной номер с другим часовым поясом, и поэтому у вас есть то, что у вас есть

person ControlAltDel    schedule 25.04.2012
comment
Пожалуйста, проверьте правильный ответ, когда будете удовлетворены (здесь может потребоваться время ожидания) - person ControlAltDel; 25.04.2012

Потому что летнее время на час опережает обычное. Установите календарь на январь, и вы не увидите разницы.

person Lexandro    schedule 25.04.2012
comment
Интересно. Итак, когда Java использует базу данных Olson Timezone DB, если она все равно использует настройки ОС? - person user1318311; 25.04.2012

Когда вы создаете дату, Java внутренне сохранит значение как GMT. Когда вы форматируете дату в строку, Java будет использовать часовой пояс вашего компьютера для преобразования даты в ваш местный часовой пояс, что является причиной того, что вы получаете разные результаты. Например, если я запустил на своем компьютере следующий код (с часовым поясом CEST):

System.out.println(new Date("Mon May 19 02:16:52 UTC 2003"));
System.out.println(new Date("Mon May 19 02:16:52 EDT 2003"));
System.out.println(new Date("Mon May 19 02:16:52 PST 2003"));

Получаю следующие результаты:

Mon May 19 04:16:52 CEST 2003
Mon May 19 08:16:52 CEST 2003
Mon May 19 12:16:52 CEST 2003

Если вам нужны более предсказуемые результаты, вы можете либо не указывать часовой пояс во вводе (например, пока ввод и вывод выполняются в одном часовом поясе, он остается неизменным), либо использовать более надежный метод, в котором вы указываете, какой часовой пояс следует использовать:

SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("EDT"));
person erikxiv    schedule 25.04.2012

Это потому, что по умолчанию SimpleDateFormat печатает дату в часовом поясе вашей системы. Чтобы проверить это, добавьте вывод часового пояса в формат: «MM / dd / yyyy HH: mm: ss z». Таким образом, вы увидите, в каком часовом поясе на самом деле выводится значение.

Если вы хотите контролировать, в каком часовом поясе вы хотите отформатировать значение, используйте метод DateFormat.setTimeZone (TimeZone z).

person dhblah    schedule 25.04.2012