Java.util.date получить фактическую дату в часовом поясе клиента - PullRequest
0 голосов
/ 12 марта 2019

Поиск вверх и вниз, вправо и влево - не найти простого ответа на этот вопрос:

У меня есть экземпляр java.util.Date, который получает значение из mySQL.

Также у меня есть код часового пояса вошедшего в систему пользователя.

Мне нужно узнать фактическое время в часовом поясе пользователя.

Например:

Мой часовой пояс сервера-компьютера : GMT + 2.

Мое значение даты в DB : 2017-02-09 16: 38: 58.000

В соответствии с моим часовым поясом сервер-машина, я получаю его в экземпляр даты как: 2017-02-09T16: 38: 58.000 + 0200

Теперь мне нужно знать, что делать, если:

В случае, например, мой код часового пояса клиента - GMT + 4, я хочу получить:

2017-02-09 20: 38: 58.000

Чистая дата, которая соответствует моему часовому поясу и не содержит индикации "+4" или "GMT".

Короче говоря: конвертируйте мою java.util.date в чистую дату, соответствующую праву на определенный часовой пояс.

Звучит очень просто? прочитав очень много документации, я уже не уверен, что это действительно просто.

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Метка времени (с часовым поясом)

Насколько я понял, дата-время в вашей базе данных в формате 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.

0 голосов
/ 12 марта 2019

java.util.Date не хранит часовой пояс.Он просто хранит количество миллисекунд, прошедших с «эпохи», то есть 1 января 1970 года, 00:00:00 UTC.

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

ОБНОВЛЕНИЕ:

int clientGMT = 4; //GMT you want to convert to
int serverGMT = 2; //server's GMT
int delta = clientGMT - serverGMT; //delta between the dates

//assume this is the date in GMT + 2 received from the server
Date d1 = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss").parse("12.03.2019 13:00:00");

//... and you want to convert it to GMT + 4 (client side's time zone)
Date resultDate = new Date(d1.getTime() + delta * 3600000);

PS Да, вам нужно вручную управлять часовыми поясами, как я уже говорил выше, java.util.Date не хранит эту информацию (предполагается, что каждая дата указана в UTC).

...