Принятый ответ в порядке. Мне просто нужно добавить две вещи:
- Вы можете проанализировать строку с недопустимым вторым значением 60, используя
ResolverStyle.LENIENT
.
- Поскольку Джон Скит в комментарии упомянул о возможной дополнительной секунде: это недопустимая дополнительная секунда. java.time поддерживает разбор (действительной) високосной секунды.
Разбор вашей строки
DateTimeFormatter lenientFormatter
= DateTimeFormatter.ISO_OFFSET_DATE_TIME
.withResolverStyle(ResolverStyle.LENIENT);
String dateString = "2018-12-04T08:06:60Z";
Instant myInstant = lenientFormatter.parse(dateString, Instant::from);
System.out.println(myInstant);
Выход:
2018-12-04T08: 07: 00Z
Таким образом, переполненное второе значение 60 было превращено в целую минуту.
Кстати, javax.xml.bind.DatatypeConverter.parseDateTime
анализируется в Calendar
(а не Date
), то есть как возвращаемый объект может фактически содержать второе значение 60. Кажется, что он обычно принимает второе значение 60, но выбрасывает исключение на 61.
Парсинг действительной високосной секунды
Это никоим образом не отвечает на ваш вопрос, но я подумал, что это может быть полезно для будущих читателей. Високосная секунда - это всегда последняя секунда дня, поэтому 23:59:60. Instant
не может удерживать это значение, но вы можете запросить, было ли оно проанализировано. Поддерживается через DateTimeFormatterBuilder.appendInstant(),
и DateTimeFormatter.parsedLeapSecond()
.
DateTimeFormatter leapSecondFormatter = new DateTimeFormatterBuilder()
.appendInstant()
.toFormatter();
Instant myInstant
= leapSecondFormatter.parse("2018-12-04T23:59:60Z", Instant::from);
System.out.println(myInstant);
TemporalAccessor parsed = leapSecondFormatter.parse("2018-12-04T23:59:60Z");
System.out.println("Instant: " + parsed.query(Instant::from));
System.out.println("Was a leap second parsed? "
+ parsed.query(DateTimeFormatter.parsedLeapSecond()));
Выход:
2018-12-04T23:59:59Z
Instant: 2018-12-04T23:59:59Z
Was a leap second parsed? true
Я не знаю, почему это должно быть так сложно, но это работает.
Ссылка: Документация DateTimeFormatter.parsedLeapSecond