Как я могу разобрать строку даты RFC 3339 в ZondeDateTime? - PullRequest
1 голос
/ 23 марта 2019

Проблема:

Я должен разобрать строку даты 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?

1 Ответ

2 голосов
/ 23 марта 2019

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

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

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

...