2016-01-15 6 views
8

Мне нужно разобрать строку в следующем формате 2015-01-15-05:00 в LocalDate (или smth else) в UTC. Проблема заключается в том, что следующий код:Java 8 Offset Date Parsing

System.out.println(LocalDate.parse("2015-01-15-05:00", DateTimeFormatter.ISO_OFFSET_DATE)); 

2015-01-15 выходы, игнорируя смещение. Требуемый выход: 2015-01-16

Заранее благодарен!

+1

Почему, по вашему мнению, результат должен быть 2015-01-16? Очевидно, вы делаете неописуемое предположение о том, что должно существовать несуществующее время синхронизации (всегда одно и то же для всех ваших входных строк ???). Для меня дата такая же, как и разбор: 2015-01-15. Нет связи с UTC из-за отсутствия временной части. –

ответ

7

Самый простой ответ заключается в использовании OffsetDateTime для представления данных, но вы должны по умолчанию время:

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .append(DateTimeFormatter.ISO_OFFSET_DATE) 
    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
    .toFormatter(); 
OffsetDateTime dt = OffsetDateTime.parse("2015-01-15-05:00", fmt); 
LocalDate date = dt.withOffsetSameInstant(ZoneOffset.UTC).toLocalDate(); 

ZonedDateTime полезен при работе с временными зонами, но когда вы имеете дело только с смещениями, OffsetDateTime проще.

В общем случае код приложения не должен содержать переменные типа TemporalAccessor. Если вы это видите, то, как правило, лучше.

+2

Прямой и авторитетный. Спасибо за руководство! –

+0

@JodaStephen, он по-прежнему выводит 2015-01-15 – StasKolodyuk

+0

@JodaStephen, это должно быть .parseDefaulting (ChronoField.HOUR_OF_DAY, 24) – StasKolodyuk

2

Похоже, я нашел душу. Вот оно:

TemporalAccessor temporalAccessor = DateTimeFormatter.ISO_OFFSET_DATE.parse("2015-01-15-05:00"); 
ZonedDateTime zonedDateTime = ZonedDateTime.of(LocalDate.from(temporalAccessor), LocalTime.MAX, ZoneId.from(temporalAccessor)); 
System.out.println(zonedDateTime.withZoneSameInstant(ZoneOffset.UTC).toLocalDate()); 

 Смежные вопросы

  • Нет связанных вопросов^_^