как получить и отформатировать дату с часовым поясом - PullRequest
0 голосов
/ 09 июля 2019

Я создаю дату и сохраняю ее в базе данных, я хочу получить текущее время, которое является часовым поясом = "Азия / Стамбул", а не мое местное время.

Я создаю дату на своем локальном компьютереМоим локальным часовым поясом также является «Азия / Стамбул».

Когда я развертываю его на своем сервере, часовой пояс сервера становится utc, он превращается в utc каждый раз.

У меня две разные машины, две машины имеют разный часовой пояс, поэтому мне нужно установить даты данных с часовым поясом.

вот что я сделал.это нормально на моем локальном компьютере, но не на сервере, который является UTC

LocalDateTime localDateTime = LocalDateTime.now();
// it gives my local date time, 2019-07-09T10:30:03.171
// local date is now 1:30 pm, UTC is 3 hours after, it looks ok.
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, ZoneId.of("Asia/Istanbul"));
//2019-07-09T10:30:03.171+03:00[Asia/Istanbul]
// it looks +3. I dont want to see +3, I want the date like 01:30 which is shiefted
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
zonedDateTime.format(formatter);
//2019-07-09T07:30:03.171Z
// zone is disappeared, this is 3 hours before UTC

Я ожидаю дату как Азия / Стамбул, когда я его создал.

1 Ответ

2 голосов
/ 09 июля 2019

Я бы не стал использовать LocalDateTime вообще.Используйте ZonedDateTime для устранения любых сомнений по поводу времени.Также всегда передавайте ZoneId (если не Clock) методу now.Это делает ваш код независимым от настроек часового пояса компьютера и JVM.

    ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneId.of("Asia/Istanbul"));
    System.out.println(zonedDateTime);

2019-07-09T14: 14: 17.280852 + 03: 00 [Азия / Стамбул]

Возможно, вы неправильно поняли часть +03:00, которую иногда делают люди.Это означает, что показанное время уже на 3 часа больше UTC.Таким образом, показанный момент времени равен 11:14:17 UTC.

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println(zonedDateTime.format(formatter));

2019-07-09 14: 14: 17

Ваш форматер делаетне включать часовой пояс, поэтому он не отображается.Но это время в Стамбуле.

Что пошло не так в вашем коде?

Я предполагаю, что комментарии в вашем коде выполняются на вашем сервере в UTC (это не совсем ясно) ичто вы ввели код около 10:30 UTC, так же, как 13:30 в Стамбуле.

A LocalDateTime - это дата и время без часового пояса и без смещения UTC.Его метод no-arg now использует настройку часового пояса JVM, в данном случае UTC, поэтому дает 10:30 в соответствующий день.Я думаю, что ZonedDateTime.of здесь не так: он берет 10:30 из LocalDateTime и стамбульского часового пояса от объекта ZoneId и дает вам 10:30 в Стамбуле, а это не то, что вы хотели.Вы хотели 13:30, АКА 13:30.

...