Java 9 и более поздние версии позволяют:
String dateTimeString = "2018-05-15 09:32:51.550082 +3:00";
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("uuuu-MM-dd HH:mm:ss.SSSSSS ")
.appendOffset("+H:MM:ss", "+0:00")
.toFormatter();
OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString, formatter);
System.out.println(dateTime);
Выход:
2018-05-15T09: 32: 51,550082 + 03: 00
Для Java 8 или ThreeTen Backport вам, вероятно, придется подготовить строку даты-времени перед ее анализом:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXX");
dateTimeString
= dateTimeString.replaceFirst("([+-])(\\d(?::\\d\\d){0,2})$", "$10$2");
Остальное как и прежде и дает тот же результат. Вызов replaceFirst
вставляет 0
между +
и 3:00
, но только если часы были только одной цифрой. Регулярное выражение трудно читать, поэтому вы предпочтете решение Java 9.
Как уже обсуждалось в комментариях, самая сложная часть - это смещение +3:00
. Встроенные средства форматирования Java и буквы шаблонов формата, которые вы можете использовать для указания собственного формата, требуют двухзначных часов в смещении. Используемый мной метод DateTimeFormatterBuilder.appendOffset
позволяет указывать ограниченное количество форматов; 9 различных форматов в Java 8; 22 в Java 9.