Как получить время отображения в том же формате, что и в формате записанной зоны? - PullRequest
0 голосов
/ 18 января 2019

У меня есть формат даты, в котором предполагается хранить информацию о часовом поясе:

SimpleDateFormat dateWithZoneFormat
            = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

Пример значения даты,

2019-01-18T07:00:00.000+0530

Константа зоны в вышеуказанную дату - Азия / Калькутта (+0530), Ссылка.

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

Мой код отображения в Java, как показано ниже:

SimpleDateFormat dateWithZoneFormat
            = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
SimpleDateFormat displayDateFormat
            = new SimpleDateFormat("MM/dd/yyyy hh:mm a");
Date date = DateUtils.getZoneDate("2019-01-18T07:00:00.000+0530");
                    String displayDate = DateUtils.displayDateFormat.format(date);
                    displayTag = displayDate + " " + displayTag;

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

Проще говоря, если время, записанное в зоне +0530 при отображении, должно показывать время отображения в зоне +0530, если оно записано в зоне +0100, оно должно отображаться в том же времени зоны.

Как показать указанную выше дату в том же формате зоны, в которой она была записана, а не в той, где она отображается (т.е. не в часовом поясе по умолчанию для машины).

Можно ли каким-либо образом извлечь только информацию о зоне в указанной выше строке даты?

1 Ответ

0 голосов
/ 18 января 2019

OffsetDateTime of java.time

    DateTimeFormatter recordedFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXX");
    DateTimeFormatter displayFormatter
            = DateTimeFormatter.ofPattern("MM/dd/yyyy hh:mm a", Locale.ENGLISH);

    OffsetDateTime dateTime = OffsetDateTime.parse("2019-01-18T07:00:00.000+0530", recordedFormatter);
    String displayDateTime = dateTime.format(displayFormatter);
    System.out.println(displayDateTime);

Этот фрагмент выводит:

01/18/2019 07:00

Время с записанной строки сохраняется. Время отображается с тем же смещением UTC.

В отличие от устаревшего Date, OffsetDateTime имеет смещение UTC, поэтому при синтаксическом анализе и форматировании сохраняется одно и то же время дня.

Использование: Азия / Калькутта является часовым поясом . +05:30 - это смещение , они не одинаковы. Например, Азия / Коломбо в настоящее время находятся в том же смещении, но все еще считаются другим часовым поясом.

Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...