Метка времени (с часовым поясом)
Насколько я понял, дата-время в вашей базе данных в формате UTC, но при ее получении вы (неправильно) получаете 2017-02-09T16: 38: 58.000 + 02: 00.
Сначала, если можете, измените тип данных столбца базы данных MySQL на timestamp
(в некоторых других базах данных он будет называться timestamp with time zone
).Это гарантирует, что MySQL знает, что время указано в UTC, и должно позволить вам извлекать их как в нужный момент времени , а не как правильное время дня в неправильном часовом поясе.Это, в свою очередь, даст вам лучшую отправную точку для конвертации в часовой пояс клиента.
java.time
Во-вторых, извлеките ваше значение в соответствующий тип из java.time, современной JavaAPI даты и времени.Избегайте java.util.Date
, так как он плохо спроектирован и не может работать с разными часовыми поясами.Например, если тип вашей базы данных - datetime
:
LocalDateTime dateTime = yourResultSet.getObject("your_col", LocalDateTime.class);
LocalDateTime
- это дата и время дня без часового пояса, поэтому вы не можете получить неправильный часовой пояс.Укажите правильное смещение:
OffsetDateTime odt = dateTime.atOffset(ZoneOffset.UTC);
Преобразовать в часовой пояс клиента:
ZoneId clientTimeZone = ZoneId.of("Indian/Reunion");
ZonedDateTime clientDateTime = odt.atZoneSameInstant(clientTimeZone);
System.out.println(clientDateTime);
2017-02-09T20: 38: 58 + 04: 00 [Индиец / Реюньон]
Пользуйтесь возможностью использовать зону реального времени в формате регион / город вместо смещения, например +04:00
.Это проще для понимания и более перспективно.Indian / Reunion - это просто пример, конечно, используйте правильный для вашего клиента.
В приведенном выше ZonedDateTime
есть смещение и часовой пояс.Рекомендуется держать это таким образом, и я не вижу, чтобы это приносило какой-либо вред.Клиент всегда может отказаться от его отображения.Если вы все еще настаиваете, снова преобразуйте в LocalDateTime
:
LocalDateTime clientDateTimeWithoutOffset = clientDateTime.toLocalDateTime();
System.out.println(clientDateTimeWithoutOffset);
2017-02-09T20: 38: 58
Если тип данных базы данныхtimestamp
:
OffsetDateTime odt = yourResultSet.getObject("your_col", OffsetDateTime.class);
Сохраняет первый шаг выше.Остаток тот же.
Ссылка
Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.