TimeZone часто посещает мой разбор даты и времени - PullRequest
1 голос
/ 08 февраля 2012

Я не могу использовать Йоду.Когда я пытаюсь создать дату или календарь из строки, представляющей дату или время в формате UTC, результирующему объекту присваивается часовой пояс ...

Вот код:

Случай 1:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyDDD");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("2012018");
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
System.out.println(cal.getTime()); //Tue Jan 17 19:00:00 EST 2012 !?!*&#&??

Дело 2:

SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmm");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = sdf.parse("1202011431");
Calendar cal = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
cal.setTime(date);
System.out.println(cal.getTime()); //Wed Feb 01 09:31:00 EST 2012 !?!*&#&??

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Объекты типа java.util.Date - это абсолютное количество времени с начала эпохи. Когда вы создаете объект Date из календаря, он теряет любую временную зону, которую мог использовать календарь, и просто дает вам необработанное количество времени. EST на самом деле не «связан» с вашей датой, просто метод toString в Date использует часовой пояс JVM по умолчанию для создания удобочитаемого представления.

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

.

(Все методы в java.util.Date, связанные с читаемыми представлениями, устарели и не работают должным образом, лучше всего просто притвориться, что они не существуют.)

1 голос
/ 08 февраля 2012

Да, даты в Java связаны с часовым поясом. ToString в Date печатает дату в местном часовом поясе. Если вы не хотите этого, используйте DateFormat, чтобы не показывать его. Обратите внимание, что вам нужно установить часовой пояс на DateFormat в UTC, чтобы получить то, что вы хотите.

1 голос
/ 08 февраля 2012

Когда вы печатаете время, оно всегда печатается в местном часовом поясе, настроенном на вашем аппарате, и это именно то, что вам нужно (сохраняйте дату и время в формате UTC и преобразуйте их в определенный часовой пояс пользователя во время презентации).

...