Как я могу разобрать строку даты RFC 3339 в ZondeDateTime?

Проблема:

Я должен проанализировать строку даты RFC3339. Он отлично работает с ISO_ZONED_DATE_TIME:

ZonedDateTime.parse("1985-04-12T23:20:50.52Z", ISO_ZONED_DATE_TIME);
ZonedDateTime.parse("1996-12-19T16:39:57-08:00", ISO_ZONED_DATE_TIME);

Допустим, я исправлю проблему Unknown Local Offset Convention, чтобы просто не принимать эти даты. Но у меня все еще есть проблема с некоторыми угловыми случаями, такими как это:

  1990-12-31T23:59:60Z

Это представляет собой дополнительную секунду, введенную в конце 1990 года.

  1990-12-31T15:59:60-08:00

Это та же самая дополнительная секунда стандартного тихоокеанского времени, которая на 8
часов отстает от UTC."1990-12-31T15:59:60-08:00"

Вопрос:

  • Как я могу разобрать его, чтобы не потерять секунды?

Обновление:

  • Существует ли какая-либо альтернатива ZonedDateTime, которая хорошо подходит для RFC3339?

person mkUltra    schedule 23.03.2019    source источник
comment
Что именно вы имеете в виду, говоря о том, чтобы не терять секунды? Я не думаю, что java.time поддерживает дополнительные секунды, например. Документировано, что ZonedDateTime.getSeconds() возвращает значение в диапазоне от 0 до 59 включительно. Были бы вы счастливы, если бы он вместо этого возвращал полночь UTC в начале 1991 года?   -  person Jon Skeet    schedule 23.03.2019


Ответы (1)


java.time не предлагает прямой поддержки того, что вам нужно. Чуть раньше сегодня я написал этот ответ, в котором также есть раздел, посвященный разбору дополнительной секунды. Но то, что там сказано, есть все, что есть.

Так что остается ручной разбор. Я бы попробовал что-то вроде этого: использовать регулярное выражение для определения, равна ли секунда 60. Если да: заменить его на 59. Разобрать. Преобразовать в UTC. Если время дня в UTC равно 23:59:59, предположим, что в исходной строке была допустимая дополнительная секунда; в противном случае строка не обозначала действительное время.

Я предполагаю, что в случае дополнительной секунды действительны значения до 60,999999999. Таким образом, чтобы определить, есть ли 60, вам нужно посмотреть, что идет после двоеточия (если есть) после минут, а не зависеть от того, есть ли дробная часть.

person Ole V.V.    schedule 23.03.2019