Чтобы получить OffsetDateTime
из строки без смещения или часового пояса, вам нужно выбрать смещение или способ его получения.Наиболее очевидный способ - если вы знаете, в каком часовом поясе должна интерпретироваться дата и время.Например:
OffsetDateTime dateTime = LocalDateTime.parse(timestamp)
.atZone(ZoneId.of("Asia/Chongqing"))
.toOffsetDateTime();
System.out.println(dateTime);
Вывод с использованием строки из вашего вопроса:
2017-11-27T19: 06: 03 + 08: 00
Не бойтесь двух преобразований из LocalDateTime
в ZonedDateTime
, а затем в OffsetDateTime
.С java.time
их не только легко сделать, но и легко прочитать.
Если вы знаете смещение, просто используйте его, тогда вам потребуется только одно преобразование (я использую бессмысленное смещение для примера,так что вам придется выбрать свой собственный):
OffsetDateTime dateTime = LocalDateTime.parse(timestamp)
.atOffset(ZoneOffset.ofTotalSeconds(-36953));
System.out.println(dateTime);
Вывод:
2017-11-27T19: 06: 03-10: 15: 53
Вы можете указать желаемое смещение, например, ZoneOffset.of("+08:00")
или ZoneOffset.ofHours(8)
.
Но чтобы ответить на ваш вопрос (сейчас самое время).
Как можноЯ перезаписываю на устройстве форматирования ZoneId, чтобы его игнорировать?
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.parseDefaulting(ChronoField.OFFSET_SECONDS, -36953)
.toFormatter();
OffsetDateTime dateTime = OffsetDateTime.parse(timestamp, formatter);
System.out.println(dateTime);
Вывод такой же, как и предыдущий (и снова вам нужно будет выбрать смещение, которое имеет смысл в вашей ситуации).