Я пытаюсь преобразовать допустимую строку ISO 8601 в согласованный формат, чтобы сортировать и искать с помощью возможен простой лексикографический порядок.
Мое приложение может получать дату/время в любом из следующих форматов, например:
2015-02-05T02:05:17.000+00:00
2015-02-05T02:05:17+00:00
2015-02-05T02:05:17Z
Все они представляют одну и ту же дату/время, и я хотел бы преобразовать их все в каноническую форму для хранения, скажем:
2015-02-05T02:05:17.000Z
Моей первой мыслью было просто проанализировать их, используя метод Converting ISO Строка, соответствующая стандарту 8601, в java.util.Date, а затем преобразуется обратно в нужную строку, но это не работает при работе с менее точными датой/временем, например:
2015-02-05T02:05:17Z
2015-02-05T02:05Z
2015-02-05Z
2015-02Z
2015Z
Неточность этих времен должна быть сохранена. Их не следует преобразовывать в:
2015-02-05T00:00:00.000Z
Я просмотрел Java 8 и Joda-Time, но они, похоже, хотят рассматривать все как конкретные моменты времени и не могут моделировать неточный характер или неполные даты/время.
ОБНОВИТЬ:
Используя Java 8, я могу сделать:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
System.out.println(dateTime.toString());
что дает мне:
2015-02-05T02:05:17Z
это то, что я хочу, но:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17.000+00:00");
System.out.println(dateTime.toString());
также дает мне:
2015-02-05T02:05:17Z
Обратите внимание, что java отбросил миллисекундную точность. Указание 000 рассматривается как не указание чего-либо, что кажется не совсем правильным.