Java конвертировать UTC в PDT / PST с библиотекой времени Java 8

java spring time java-8

8010 просмотра

1 ответ

2525 Репутация автора

Я хотел бы использовать встроенную библиотеку времени Java 8 для преобразования из UTC в PST / PDT.

Я пишу программу, которая общается с API, который возвращает список объектов в соответствии с временными рамками. Например, объекты, созданные / измененные с определенной даты и времени.

Моя программа использует LocalDateTimeи значение всегда в UTC.
API принимает PST / PDT.
«Часовой пояс, представленный во всех ответах API, - это PST / PDT. Аналогично, CompanyName просит вас выполнить все преобразования часовых поясов и отправить любые запросы dateTime в PST / PDT». - цитата из документации API

Я думаю, что они подразумевают под PST / PDT, так это то, что значение времени должно отражать, находится ли оно в дневном свете или нет.
Например, значение времени меняется два раза в год.

Если это так, есть ли практический / обычный способ конвертировать из UTC в PST / PDT, не выясняя вручную , стоит ли переходить на летнее время, если посмотреть точную дату?

ОБНОВИТЬ

API возвращает объекты в формате JSON.
Мое приложение отправляет запрос к своему API с параметром запросаapi.com/objects?modified-date=${yyyy-MM-dd hh:mm:ss}

В настоящее время я использую следующий метод для преобразования:

public static String toSsTimeStr(LocalDateTime utcTime){
    String pattern  = "yyyy-MM-dd HH:mm:ss";

    ZonedDateTime zdt = ZonedDateTime.ofInstant(utcTime, ZoneOffset.UTC, ZoneId.of("America/Los_Angeles"));

    String timeStr = zdt.format(DateTimeFormatter.ofPattern(pattern));
    return timeStr;
}  

Поможет ли это отрегулировать переход на летнее время, другими словами, вернет ли мне правильное значение в соответствии с текущим статусом перехода на летнее время?

Спасибо.

Автор: Minjun Yu Источник Размещён: 18.07.2016 11:01

Ответы (1)


9 плюса

139916 Репутация автора

Решение

Моя программа использует LocalDateTime, и значение всегда в UTC.

А LocalDateTimeвообще не имеет часового пояса, поэтому его нет в UTC.

На мгновение в UTC используйте Instantкласс. Это представляет момент на временной шкале с точностью до наносекунды.

Instant now = Instant.now();

Чтобы настроить часовой пояс, примените a, ZoneIdчтобы получить ZonedDateTime.

Никогда не используйте 3-4 буквенные аббревиатуры , как PSTи PDTтак часто видели в средствах массовой информации. Они не являются зонами реального времени, не стандартизированы и даже не являются уникальными (!). Используйте правильные имена часовых поясов в continent/regionформате.

ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = instant.atZone( zoneId );

Похоже, что ваш приемник данных имеет плохой дизайн ввода строки, которая представляет значение даты-времени, предположительно находящееся в America/Los_Angelesчасовом поясе, но без какого-либо индикатора (без смещения от UTC, без часового пояса).

Чтобы получить такую ​​строку, без какого-либо смещения или зоны, используйте предопределенное DateTimeFormatterимя ISO_LOCAL_DATE_TIME. Вы получите строку в стандартном ISO 8601 формата , как это: 2011-12-03T10:15:30.

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME );

Ваш приемник данных опускается Tс середины, поэтому замените его пробелом.

output = output.replace( `T` , " " );

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

zdt = zdt.truncatedTo( ChronoUnit.SECONDS );

Идя в другом направлении, от строки к объекту, определите форматер, проанализируйте его LocalDateTimeи примените предполагаемый часовой пояс.

String input = "2011-12-03 10:15:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss" );
LocalDateTime ldt = LocalDateTime.parse( input , formatter );
ZoneId zoneId = ZoneId.of( "America/Los_Angeles" );
ZonedDateTime zdt = ldt.atZone( zoneId );
Автор: Basil Bourque Размещён: 18.07.2016 11:47
Вопросы из категории :
32x32