Преобразование java.util.Date в другой запрошенный часовой пояс

В зависимости от URL-адреса запроса мне нужно преобразовать дату в другой запрошенный часовой пояс и вернуть дату и время в виде строки. Я использую java 8 с весенней загрузкой и монго 3.2.

Итак, внутри метода обслуживания я сначала устанавливаю часовой пояс, как показано ниже,

TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE))

Но я заметил, что это изменит часовой пояс всего java-приложения. Таким образом, даже при выходе из метода часовой пояс останется часовым поясом, который я установил ранее.

Поэтому вместо уровня метода setDefault я специально установил его в SimpleDateFormat, как показано ниже,

(назначение — это класс документа Assignmet, имеющий java.util.Date в качестве свойства с именемassignEndDate, которое сопоставляется с коллекцией mongodb. В mongo db НазначениеEndDate хранится как UTC)

   java.text.DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy'T'HH:mm:ss.SSS");
   formatter.setTimeZone(TimeZone.getTimeZone(timezone));
   Date assignmentEndDate = assignment.getAssignmentEndDate();
   formatter.format(assignmentEndDate);

Таким образом, он не изменит часовой пояс на уровне приложения. Это правильный подход для такого сценария?


person Harshana    schedule 03.12.2016    source источник
comment
Есть ли причина, по которой вы ограничены java.util.Date и не можете использовать пакет java.time?   -  person Joe C    schedule 03.12.2016
comment
ваш код верен для более старых API даты/времени Java.   -  person jtahlborn    schedule 03.12.2016
comment
@jtahlborn Итак, вы рекомендуете использовать API java.time вместо java.util.Date?   -  person Harshana    schedule 04.12.2016
comment
если у вас есть возможность использовать более новый API, то это, вероятно, имеет смысл. в противном случае код, который у вас есть, должен работать нормально.   -  person jtahlborn    schedule 04.12.2016
comment
@jtahlborn Спасибо. Но не думаете ли вы, что изменение часового пояса на уровне приложения только тогда, когда мы меняем часовой пояс для конкретного запроса, является проблемой?   -  person Harshana    schedule 04.12.2016
comment
@JoeC Нет особой причины. Я думаю о рефакторинге их в java.time   -  person Harshana    schedule 04.12.2016
comment
возможно, я не понимаю, что вы спрашиваете. установка часового пояса приложения по умолчанию абсолютно неверна. ваш второй блок кода, в котором вы меняете часовой пояс для определенного ответа, является правильным способом справиться с такой ситуацией.   -  person jtahlborn    schedule 05.12.2016
comment
@jtahlborn да, ты прав. поэтому первый блок кода был тем, что у меня было до добавления второго блока кода. Поэтому, как только я понимаю, что TimeZone.setDefault(TimeZone.getTimeZone(TIME_ZONE)) изменит часовой пояс на уровне приложения, я использую второй блок кода.   -  person Harshana    schedule 06.12.2016
comment
@jtahlborn Не могли бы вы ответить и на этот вопрос. В другом сценарии мне нужно сделать что-то вроде сравнения текущей даты с другой датой. Поэтому я использую java.util.Date перед методом. Поскольку у нас серверы приложений распределяют две зоны, я устанавливаю с помощью TimeZone.setDefault(timezone) и использую метод before. Например: TimeZone.setDefault(часовой пояс);   -  person Harshana    schedule 06.12.2016
comment
Экземпляры Date не имеют часового пояса. они всегда UTC. поэтому установка часового пояса для сравнения двух экземпляров Date не имеет смысла.   -  person jtahlborn    schedule 06.12.2016
comment
@jtahlborn Что ж, когда я просто инициализирую объект Date, я обнаруживаю, что он назначит часы, минуты и т. Д. С учетом текущего часового пояса сервера, а не UTC. Возможно, эта путаница является причиной того, что эти API-интерфейсы getHour и т. Д. Устарели. Но поле fastTime, которое сохраняет дату и время в миллисекундах, всегда сохраняет значение в UTC, знаете? Итак, при использовании метода before () объект Date использует значение в поле fastTime, нам не нужно явно устанавливать TImeZone в UTC?   -  person Harshana    schedule 06.12.2016


Ответы (1)


Воспользуйтесь преимуществами нового API даты и времени, включенного в Java 8.

ZoneId zoneId = ZoneId.of("America/Chicago");

Вы можете начать с Instant, эквивалент даты использования Java.

Instant instant = Instant.now();
ZonedDateTime zonedDateTime = instant.atZone(zoneId);

Or

Вы также можете начать с использования ZonedDateTime

Вы можете использовать дату и время как LocalDateTime., класс, не зависящий от часового пояса, и преобразуйте его в ZonedDateTime.

LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ldt.atZone(zoneId);

Вы можете легко переключаться между старыми классами даты и времени и новым временем, обращаясь к вспомогательным методам в каждом из новых/старых классов даты и времени.

Изменить дату использования java при сохранении в базе данных mongo

//From ZonedDateTime to java util date.
Date oldDate = Date.from(zdt.toInstant());

//From Instant to java util date
Date oldDate = Date.from(instant);

//From Date to Instant.
Instant instant = date.toInstant();

Все новые API-интерфейсы даты и времени имеют встроенный форматировщик по умолчанию.

//2007-12-03T10:15:30-06:00[America/Chicago]
String zonedDatetime = zonedDateTime.toString();

Для конкретного формата вы всегда можете передать DateTimeFormatter к приведенному ниже методу.

zonedDateTime.format(formatter)
person s7vr    schedule 03.12.2016