Есть ли у DateTimeFormatter что-нибудь похожее на метод DateTimeFormatter#withOffsetParsed() в Joda?

У меня проблема с новым Java Date-API, особенно с java.time.DateTimeFormatter.

Я ищу способ добавить TimeZone-Offset к заданному времени.

e.g.

 "2016-05-27 14:22:00 UTC+2" 

следует разобрать на

 "27.05.2016 16:22:00" 

(используя шаблон «дд.ММ.гггг ЧЧ:мм:сс»)

Это мой проблемный код:

LocalDateTime time = LocalDateTime.now();
LOG.debug(time.format(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));

Результатом форматирования является строка времени, соответствующая заданному шаблону, но без учета смещения локального часового пояса.


person tnte    schedule 27.05.2016    source источник
comment
Вы хотите 16:22 (например: добавить 2 часа к дате в исходной строке) или вы хотите 12:22 (например: местное время в часовом поясе UTC)? В первом случае вам, вероятно, потребуется вручную проанализировать конец строки, если в первом случае вы можете сначала использовать OffsetDateTime.   -  person assylias    schedule 27.05.2016


Ответы (2)


Один из многих способов применения часового пояса, смещения и форматирования. Это поможет переключаться между временем Joda и Java 8.

API даты/времени Java 8

String input = "2016-05-27 14:22:02 UTC+0200";
DateTimeFormatter parser = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss 'UTC'Z");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
LocalDateTime localDateTime = parser.parse(input, LocalDateTime::from);
System.out.println(localDateTime); //2016-05-27T14:22:02
//Apply different offset on the above instant.
OffsetDateTime offsetDateTime = parser.parse(input, OffsetDateTime::from).withOffsetSameInstant(ZoneOffset.of("+07:00"));
System.out.println(offsetDateTime); //2016-05-27T19:22:02+07:00
//Apply different timezone on the above instant.
ZonedDateTime zonedDateTime = parser.parse(input, ZonedDateTime::from).withZoneSameInstant(ZoneId.of("Asia/Jakarta"));
System.out.println(zonedDateTime);// 2016-05-27T19:22:02+07:00[Asia/Jakarta]
//Apply formatting
System.out.print(formatter.format(zonedDateTime));//27.05.2016 19:22:02

Joda API

String input = "2016-05-27 14:22:02 UTC+0200";
DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss 'UTC'Z");
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd.MM.yyyy HH:mm:ss");
LocalDateTime localDateTime = parser.parseLocalDateTime(input);
System.out.println(localDateTime);//2016-05-27T14:22:02.000
//Apply the above offset to the date time
DateTime offsetParsedDateTime = parser.withOffsetParsed().parseDateTime(input);
//Change to new Offset
DateTime jakartaDateTimeOffset = offsetParsedDateTime.toDateTime(DateTimeZone.forOffsetHours(7));
System.out.println(jakartaDateTimeOffset);//2016-05-27T19:22:02.000+07:00
//Change to new Zone
DateTime jakartaDateTimeZone = offsetParsedDateTime.toDateTime( DateTimeZone.forID("Asia/Jakarta") );
System.out.println(jakartaDateTimeZone);//2016-05-27T19:22:02.000+07:00
//Apply formatting
System.out.print(formatter.print(jakartaDateTimeZone ));//27.05.2016 19:22:02
person s7vr    schedule 27.05.2016
comment
Это помогло. Спасибо - person tnte; 28.05.2016

Да, вы можете указать смещение, которое хотите учитывать. Вы можете сделать это несколькими различными способами, но я поделюсь фрагментом кода, который поможет вам.

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Local.US);

Это пример создания ОФ с набором шаблона и смещения.

person codex    schedule 27.05.2016
comment
@assylias Извините за это, просто хотел привести быстрый пример. - person codex; 27.05.2016