Как преобразовать дату и время в формате UTC в конкретную дату и время в зоне и проверить, является ли переход на летнее время - PullRequest
0 голосов
/ 14 января 2019

У меня есть время по Гринвичу, например

String dateTime = "2018-04-23 19:50:53.236";

Я хочу преобразовать это в определенный часовой пояс US/Eastern, а затем я хочу проверить, что преобразованный datetime подпадает под DaylightSavings

TimeZone

TimeZone.getTimeZone("US/Eastern");

Код летнего времени

ZoneId.of("US/Eastern")
  .getRules()
  .isDaylightSavings( 
      Instant.now() 
  )

Если isDaylightSavings возвращает true, мне нужно добавить смещение (-04:00) для ввода dateTime

Пример вывода

dateTime = "2018-04-23T19:50:53-04:00"

Если isDaylightSavings возвращает false, мне нужно добавить смещение (-05:00) для ввода dateTime

Пример вывода

dateTime = "2018-04-23T19:50:53-05:00"

У меня есть кусочки кода, но я запутался, как объединить их все, и последний вопрос

Как создать текущую datetime f другую зону в UTC со смещением, например, рассмотрим это US/Eastern

Пример вывода

dateTime = "2019-01-14T14:12:53-05:00"

1 Ответ

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

Как было сказано в комментариях, это более автоматически, чем вы думаете.

    DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE)
            .appendLiteral(' ')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .toFormatter();
    ZoneId zone = ZoneId.of("America/New_York");

    String dateTime = "2018-04-23 19:50:53.236";
    ZonedDateTime usEasternTime = LocalDateTime.parse(dateTime, inputFormatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(zone);
    String formattedDateTime = usEasternTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    System.out.println(formattedDateTime);

Вывод:

2018-04-23T15: 50: 53.236-04: 00

Запрошенное вами смещение -04:00 выводится как часть стандартного формата ISO 8601. Вывод времени 15:50:53, где вы просили 19:50:53. Я понял, что 19:50:53 был в UTC, и в это время UTC время в восточной части США составляет 15:50:53 или на 4 часа меньше.

Если вместо этого мы берем дату зимой, мы получим -05:00, а время дня будет на 5 часов меньше времени UTC:

    String dateTime = "2018-11-23 19:50:53.236";

2018-11-23T14: 50: 53.236-05: 00

EDIT

любая идея, как удалить миллисекунды ...

    String formattedDateTime = usEasternTime.truncatedTo(ChronoUnit.SECONDS)
            .format(DateTimeFormatter.ISO_OFFSET_DATE_TIME);

2018-04-23T15: 50: 53-04: 00

(продолжение)

… а это [America/New_York]

Когда вы печатаете ZonedDateTime, идентификатор зоны также печатается. Выше я использую встроенный форматер для управления выводом. Другой вариант - конвертировать в OffsetDateTime:

    OffsetDateTime odt = usEasternTime.truncatedTo(ChronoUnit.SECONDS)
            .toOffsetDateTime();
    System.out.println(odt);

2018-04-23T15: 50: 53-04: 00

Если бы 19:50:53 было по восточному времени, все было бы немного проще:

    ZonedDateTime usEasternTime = LocalDateTime.parse(dateTime, inputFormatter)
            .atZone(zone);

2018-04-23T19: 50: 53.236-04: 00

Текущий способ определения часового пояса - регион / город , поэтому я использую America/New_York, хотя устаревший US/Eastern все еще работает и дает тот же результат.

Класс TimeZone имеет проблемы с дизайном и устарел, заменен на ZoneId, поэтому просто используйте последний.

Ссылка: Список часовых поясов базы данных tz в Википедии

...