OffsetDateTime Z в строке - PullRequest
       10

OffsetDateTime Z в строке

1 голос
/ 02 марта 2020

У меня есть

OFfsetDateTime `OffsetDateTime date = OffsetDateTime.parse("2020-03-02T14:25:54.871Z");

что означает "Z"? Как я могу добавить к этому час?

Я пытался сделать

OffsetDateTime date = OffsetDateTime.parse("2020-03-02T14:25:54.871Z+1");

, но это не разбирается.

Спасибо:)

1 Ответ

1 голос
/ 02 марта 2020

Вы не хотите этого.

  1. Вы хотите одно и то же мгновение, один и тот же момент времени. Поэтому конвертируйте OffsetDateTime в другое смещение, регулируя время дня, чтобы учесть, что время дня с новым смещением отличается.
  2. В большинстве случаев вы не хотите указывать смещение преобразовать в напрямую. Вместо этого укажите, какой часовой пояс вы хотите преобразовать в. Пусть Java найдет для вас правильное смещение для этого часового пояса для этого дня.

Z означает смещение нуля от UT C. Иногда его называют «часовой пояс Зулу», хотя это смещение, а не часовой пояс.

Преобразование времени в другой часовой пояс

Например:

    OffsetDateTime date = OffsetDateTime.parse("2020-03-02T14:25:54.871Z");
    ZoneId newZone = ZoneId.of("Europe/Prague");
    OffsetDateTime dateAtNewOffset
            = date.atZoneSameInstant(newZone).toOffsetDateTime();
    System.out.println(dateAtNewOffset);

Вывод этого фрагмента кода:

2020-03-02T15: 25: 54.871 + 01: 00

Обратите внимание, что сейчас настал час дня 15 вместо 14 для компенсации другого смещения. Когда время 14:25 UT C, в Праге это 15:25 (кроме случаев, когда действует летнее время (DST); Java будет обрабатывать это и для вас, если у вас есть свидание в летнее время) года).

Чтобы указать смещение

Если вы хотите указать смещение самостоятельно:

    ZoneOffset newOffset = ZoneOffset.ofHours(1);
    OffsetDateTime dateAtNewOffset = date.withOffsetSameInstant(newOffset);

Результат тот же, что и раньше.

Для добавления 1 часа к смещению без изменения часа

Для ответа на вопрос, который вы задаете. Я повторяю свое предупреждение: ЭТО НЕ ТО, ЧТО ВЫ ХОТИТЕ .

    ZoneOffset oldOffset = date.getOffset();
    ZoneOffset newOffset = ZoneOffset.ofTotalSeconds(Math.toIntExact(
            oldOffset.getTotalSeconds() + Duration.ofHours(1).getSeconds()));
    OffsetDateTime dateAtNewOffset = date.withOffsetSameLocal(newOffset);

Теперь вывод напоминает то, что вы просили:

2020-03-02T14 : 25: 54.871 + 01: 00

...