Nano Hash - криптовалюты, майнинг, программирование

Преобразование даты ISO 8601 в стандартный формат строки

Я пытаюсь преобразовать допустимую строку 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 рассматривается как не указание чего-либо, что кажется не совсем правильным.

05.02.2015

  • 2015-02-05T02:05:17+0000 не является допустимой датой ISO. 05.02.2015
  • Википедия предполагает, что +0000 является допустимым смещением. У вас есть лучшая ссылка? 05.02.2015
  • Я не думаю, что существует единственный объект, который может содержать дату с определенными вами ограничениями (т.е. с частичной точностью). Поэтому лучше всего использовать собственное представление. 05.02.2015
  • @JamesScriven, если WP так говорит, то это неправильно. Вы либо предоставляете все части в расширенном формате, либо в стандартном формате, но не в смешанном виде. См. мой комментарий к Джерси по этому поводу. Я могу процитировать главу ISO 8601, если хотите. 05.02.2015
  • @ Michael-O В моей голове не было четкого различия между базовой и расширенной нотацией. Я обновил вопрос, чтобы удалить плохие примеры. Спасибо. 06.02.2015
  • Вы можете сохранить LocalDateTime и точность в виде двух полей. Это сохранит всю необходимую информацию. Нет ни одного встроенного типа, который будет делать то, что вы хотите. 06.02.2015

Ответы:


1

В Java 8 вы можете использовать LocalDate.parse() или LocalDateTime.parse() для String без указания шаблона, если строка имеет формат ISO 8601.

parse(), получает экземпляр LocalDate из текстовой строки, например 2007-12-03. Строка должна представлять допустимую дату и анализируется с использованием DateTimeFormatter.ISO_LOCAL_DATE.

и,

DateTimeFormatter.ISO_LOCAL_DATE, возвращает неизменяемый модуль форматирования, способный форматировать и анализировать ISO 8601.

Например,

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);

String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);

дает

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30

Обновление:

ваша дата, то есть "2015-02-05T02:05:17.000+00:00", будет отбрасывать нули только тогда, когда они все нули, если значение наносекунд отличается от нулей, тогда оно будет отображаться очень хорошо, однако, если вы хотите отображать нули, вы можете просто добавить блок if/else и добавьте нули к вашей дате if ваши наносекунды равны нулю (yourdate.getNano()==0), else напечатайте как есть,

String dateTimestr = "2015-02-05T02:05:17.000+00:00";

OffsetDateTime dateTime = OffsetDateTime.parse(dateTimestr);

if ((dateTime.getNano() == 0) && (dateTimestr.length() > 25 ))
    System.out.println(dateTime.toLocalDateTime() + ".000Z");

else
    System.out.println(dateTime.toString());

отдаст

2015-02-05T02:05:17.000Z

изменение даты на,

String dateTimestr = "2015-02-05T02:05:17+00:00";

дает

2015-02-05T02:05:17Z

изменение даты на,

String dateTimestr = "2015-02-05T02:05:17.100+00:00";

дает

2015-02-05T02:05:17.100Z

изменить его на,

String dateTimestr = "2015-02-05T02:05:17Z";

дает

2015-02-05T02:05:17Z
05.02.2015
  • Это очень полезно, но, пожалуйста, посмотрите мое обновление, почему это не совсем работает. 05.02.2015
  • Мне не ясно, как это решает проблему сохранения точности (и отсутствия точности) 06.02.2015

  • 2

    Вы должны понимать, что сохранение точности может происходить только в текстовом пространстве, но не в пространстве значений. Таким образом, различная степень точности может быть выражена текстовым способом (см. ваш ввод), но не в объекте значения (здесь типа OffsetDateTime). Последний хранит только значение даты и времени, но не какую-либо дополнительную информацию о точности. Если вы действительно хотите достичь этой цели, у вас нет другого выбора, кроме как написать свой собственный класс как оболочку вокруг OffsetDateTime и точности (выраженной как ChronoUnit-enum).

    В противном случае, если вы всегда хотите сохранить точность в миллисекундах для своего вывода, вам следует использовать не метод toString(), а специальный форматировщик. В Java-8 это будет выглядеть так:

    OffsetDateTime odt = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
    String dateTimeWithMilliSecondPrecision = 
      odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx"));
    System.out.println(dateTimeWithMilliSecondPrecision);
    // output: 2015-02-05T02:05:17.000+00:00
    
    06.02.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..