Есть несколько вариантов.
Во-первых, как вы говорите, вставка двоеточия в смещение зоны не так уж трудна. После того как вы сделали это, получая ZonedDateTime
просто:
ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+01:00");
System.out.println(zdt);
Печатается:
2017-01-11T09:38:41+01:00
В качестве альтернативы, странно, в то время как ZonedDateTime.parse(String)
нужно двоеточия смещения, ZoneId.of()
не делает, так что вы можете отделить смещение и выполнить:
ZoneId zi = ZoneId.of("+0100");
LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41");
ZonedDateTime zdt = ldt.atZone(zi);
Результат такой же, как и раньше.
Если вы не хотите модифицировать строку до разбора его, есть также:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ");
ZonedDateTime zdt = ZonedDateTime.parse("2017-01-11T09:38:41+0100", dtf);
Кроме того, это дает тот же результат.
Редактировать: Note: Я использую ZonedDateTime
, так как вы просили об этом в своем вопросе. Вы можете более правильно использовать OffsetDateTime
. Большая часть кода практически такая же. Версия, которая отщепляет смещение будет идти, как это:
ZoneOffset zo = ZoneOffset.of("+0100");
LocalDateTime ldt = LocalDateTime.parse("2017-01-11T09:38:41");
OffsetDateTime odt = ldt.atOffset(zo);
Чтобы преобразовать в UTC, как уже упоминалось в конце вопрос, применить другой ZoneOffset
, постоянная ZoneOffset.UTC
.
OffsetDateTime odtUtc = odt.withOffsetSameInstant(ZoneOffset.UTC);
возможно дубликат [Java Time Zone При разборе DateFormat] (http://stackoverflow.com/questions/4542679/java- time-zone-when-parsing-dateformat) –
Возможный дубликат http://stackoverflow.com/questions/34115801/how-to-convert-any-date-time-to-utc-using-zoneddatetime-or-java-8 ? rq = 1 – nikli
Сохраните ваши даты в виде длинных значений, представляющих число миллисекунд в UTC. Таким образом, вы можете легко отображать их, но вы хотите позже. При хранении дат UTC и часовой пояс не имеют значения. Для отображения это другой вопрос. –