Различия между Java 8 Date Time API (java.time) и Joda-Time

Я знаю, что есть вопросы, касающиеся java.util.Date и Joda-Time. Но после некоторого поиска я не смог найти нить о различиях между API java.time (новый в Java 8, определенный в JSR 310) и Joda-Time.

Я слышал, что java.time API в Java 8 намного чище и может делать гораздо больше, чем Joda-Time. Но я не могу найти примеров, сравнивающих два.

  • Что может сделать java.time, чего не может Joda-Time?
  • Что может сделать java.time лучше, чем Joda-Time?
  • Производительность лучше с java.time?

4 ответа

Решение

Общие черты

а) Обе библиотеки используют неизменяемые типы. Joda-Time также предлагает дополнительные изменяемые типы, такие как MutableDateTime,

б) Более того: обе библиотеки вдохновлены исследованием дизайна "TimeAndMoney" Эрика Эванса или идеями Мартина Фаулера о доменно- ориентированном стиле, поэтому они более или менее стремятся к свободному стилю программирования (хотя и не всегда идеально;-)).

в) с обеими библиотеками мы получаем реальный тип календарной даты (называемый LocalDate), тип реального времени стены (называется LocalTime) и состав (называется LocalDateTime). Это очень большая победа по сравнению со старым java.util.Calendar а также java.util.Date,

d) обе библиотеки используют метод, ориентированный на метод, то есть они поощряют использование пользователем getDayOfYear() вместо get(DAY_OF_YEAR), Это вызывает много дополнительных методов по сравнению с java.util.Calendar (хотя последний не является типобезопасным вообще из-за чрезмерного использования ints).

Спектакль

Посмотрите другой ответ @OO7, указывающий на анализ Михаила Воронцова, хотя пункт 3 (отлов исключений), вероятно, устарел - см. Эту ошибку JDK. Различная производительность (что в целом благоприятствует JSR-310) в основном обусловлена ​​тем фактом, что внутренняя реализация Joda-Time всегда использует подобный машинному времени длинный примитив (в миллисекундах).

Ноль

Joda-Time часто использует NULL в качестве значения по умолчанию для системного часового пояса, языка по умолчанию, текущей метки времени и т. Д., В то время как JSR-310 почти всегда отклоняет значения NULL.

точность

JSR-310 работает с точностью до наносекунды, в то время как Joda-Time ограничена точностью до миллисекунды.

Поддерживаемые поля:

Обзор поддерживаемых полей в Java-8 (JSR-310) дается некоторыми классами во временном пакете (например, ChronoField и WeekFields), в то время как Joda-Time довольно слаб в этой области - см. DateTimeFieldType. Самым большим недостатком Joda-Time здесь является отсутствие локализованных недельных полей. Общей особенностью дизайна реализации обоих полей является то, что оба основаны на значениях типа long (никаких других типов, даже перечислений).

Enum

JSR-310 предлагает перечисления как DayOfWeek или же Month в то время как Joda-Time не предлагает этого, потому что он был в основном разработан в 2002-2004 годах до Ja va 5.

API зоны

а) JSR-310 предлагает больше функций часового пояса, чем Joda-Time. Последние не могут дать программный доступ к истории переходов смещения часового пояса, в то время как JSR-310 способен это сделать.

б) Для вашей информации: JSR-310 переместил свой внутренний репозиторий часовых поясов в новое место и другой формат. Старая папка библиотеки lib/zi больше не существует.

Настройщик против Собственности

JSR-310 представила TemporalAdjuster-интерфейс как формализованный способ экстернализации временных вычислений и манипуляций, особенно для авторов библиотек или фреймворков, это хороший и относительно простой способ встраивания новых расширений JSR-310 (своего рода эквивалент статических вспомогательных классов для прежних java.util.Date).

Однако для большинства пользователей эта функция имеет очень ограниченную ценность, поскольку бремя написания кода по-прежнему лежит на пользователе. Встроенные решения на основе нового TemporalAdjuster -концепт не так много, в настоящее время есть только вспомогательный класс TemporalAdjusters с ограниченным набором манипуляций (и перечисления Month или другие временные типы).

Joda-Time предлагает полевой пакет, но практика показала, что новые полевые реализации очень трудно кодировать. С другой стороны, Joda-Time предлагает так называемые свойства, которые делают некоторые манипуляции намного проще и элегантнее, чем в JSR-310, например, property.withMaximumValue ().

Календарные системы

JSR-310 предлагает 4 дополнительные календарные системы. Наиболее интересным является Umalqura (используется в Саудовской Аравии). Другие 3: Minguo (Тайвань), японский (только современный календарь с 1871 года!) И ThaiBuddhist (только правильный после 1940 года).

Joda-Time предлагает исламский календарь, основанный на калькуляционной основе, а не календарь, основанный на прицеле, как Umalqura. Тайский буддист также предлагается Joda-Time в аналогичной форме, Minguo и японский нет. В противном случае Joda-Time также предлагает коптский и эфиопский календарь (но без какой-либо поддержки интернационализации).

Более интересным для европейцев: Joda-Time также предлагает григорианский, юлианский и смешанно- григориано -юлианский календарь. Однако практическая ценность для реальных исторических вычислений ограничена, потому что важные функции, такие как разные года в истории дат, вообще не поддерживаются (такая же критика действительна для старых java.util.GregorianCalendar).

Другие календари, такие как иврит, персидский или индусский, полностью отсутствуют в обеих библиотеках.

Эпоха дней

JSR-310 имеет класс JulianFields, а Joda-Time (версия 2.0) предлагает некоторые вспомогательные методы в классе DateTimeUtils.

Часы

У JSR-310 нет интерфейса (ошибка проектирования), но есть абстрактный класс java.time.Clock который может использоваться для любого внедрения зависимости часов. Вместо этого Joda-Time предлагает интерфейс MillisProvider и некоторые вспомогательные методы в DateTimeUtils. Таким образом, Joda-Time также может поддерживать тестовые модели с разными часами (издевательства и т. Д.).

Продолжительность арифметики

Обе библиотеки поддерживают расчет временных расстояний в одной или нескольких временных единицах. Тем не менее, при обработке длительностей в одну единицу стиль JSR-310 явно лучше (и основывается на длинных, а не на использовании int):

JSR-310 => long days = ChronoUnit.DAYS.between(date1, date2);

Joda-Time => int days = DAYS.daysBetween(date1, date2).getDays();

Обработка множественных длительностей также различна. Даже результаты расчетов могут отличаться - см. Этот закрытый выпуск Joda-Time. В то время как JSR-310 использует очень простой и ограниченный подход, чтобы использовать только классы Period (продолжительность основана на годах, месяцах и днях) и Duration (основанный на секундах и наносекундах), Joda-Time использует более сложный способ, используя класс PeriodType чтобы контролировать, в каких единицах должна быть выражена продолжительность (Joda-Time называет это "Период"). В то время как PeriodType -API как-то неловко использовать подобный способ, который вообще не предлагается JSR-310. В частности, в JSR-310 пока невозможно определить смешанную длительность даты и времени (например, на основе дней и часов). Так что будьте осторожны, если речь идет о миграции из одной библиотеки в другую. Обсуждаемые библиотеки несовместимы - несмотря на частично одинаковые имена классов.

Интервалы

JSR-310 не поддерживает эту функцию, в то время как Joda-Time имеет ограниченную поддержку. Смотрите также этот SO-ответ.

Форматирование и анализ

Лучший способ сравнить обе библиотеки - это просмотреть классы с одинаковыми именами DateTimeFormatterBuilder (JSR-310) и DateTimeFormatterBuilder (Joda-Time). Вариант JSR-310 немного более мощный (также может работать с любым TemporalField при условии, что полевой разработчик сумел закодировать некоторые точки расширения, такие как resol ()). Однако самое важное отличие - на мой взгляд:

JSR-310 может намного лучше анализировать имена часовых поясов (символ шаблона формата z), в то время как Joda-Time вообще не могла этого делать в своих более ранних версиях и теперь только очень ограниченным образом.

Еще одним преимуществом JSR-310 является поддержка автономных названий месяцев, что важно для таких языков, как русский или польский и т. Д. Joda-Time не имеет доступа к таким ресурсам - даже на платформах Ja va-8.

Синтаксис шаблона в JSR-310 также более гибкий, чем в Joda-Time, допускает наличие необязательных секций (используя квадратные скобки), более ориентирован на стандарт CLDR и предлагает заполнение (буквенный символ p) и большее количество полей.

В противном случае следует отметить, что Joda-Time может форматировать длительности с использованием PeriodFormatter. JSR-310 не может этого сделать.


Надеюсь, этот обзор поможет. Вся собранная информация в основном там благодаря моим усилиям и исследованиям, как спроектировать и внедрить лучшую библиотеку даты и времени (ничто не идеально).

Обновление от 2015-06-24:

Тем временем я нашел время, чтобы написать и опубликовать табличный обзор для разных временных библиотек на Ja va. Таблицы также содержат сравнение между Joda-Time v2.8.1 и Java-8 (JSR-310). Это более подробно, чем этот пост.

Java 8 Дата / Время:

  1. Java 8 классы построены вокруг человеческого времени. Это делает их быстрыми для арифметики и преобразования даты и времени.
  2. Компоненты получения даты / времени, такие как getDayOfMonth имеют сложность O(1) в реализации Java 8.
  3. Разбор OffsetDateTime/OffsetTime/ZonedDateTime в Java 8 ea b121 работает очень медленно из-за исключений, возникающих и перехваченных внутри JDK.
  4. Набор пакетов: java.time.*, java.time.chrono.*, java.time.format.*, java.time.temporal.*, java.time.zone.*
  5. Экземпляры (временные метки) Дата и время Частичное Дата и время Парсер и форматер Часовые пояса Различные хронологии (календари).
  6. Существующие классы имеют проблемы, такие как Date не поддерживает I18N или L10N. Они изменчивы!
  7. Проще и надежнее.
  8. Часы могут быть введены.
  9. Часы могут быть созданы с различными свойствами - Статические часы, Смежные часы, Часы с низкой точностью (целые секунды, целые минуты и т. Д.).
  10. Часы могут быть созданы с определенными часовыми поясами. Clock.system(Zone.of("America/Los_Angeles")),
  11. Делает тестирование даты и времени обработки кода.
  12. Делает тесты независимыми от часового пояса.

Joda-Time:

  1. Joda-Time использует машинное время внутри. Ручная реализация, основанная на значениях int/long, будет намного быстрее.
  2. Геттеры Joda-Time требуют вычисления времени от компьютера к человеку при каждом вызове геттера, что делает Joda-Time узким местом в таких сценариях.
  3. Он состоит из неизменяемых классов, которые он обрабатывает Instants, Date & Time, Partials и Durations. Он гибкий. Он хорошо спроектирован.
  4. Представляет даты как моменты. Но дата и время могут соответствовать более чем одному мгновению. Час перекрытия, когда заканчивается летнее время. А также нет ни одного момента, который ему соответствует вообще. Разрыв в час, когда начинается дневной свет. Должен выполнять сложные вычисления для простых операций.
  5. Принимает пустые значения в качестве допустимых значений в большинстве своих методов. Приводит к тонким ошибкам.

Для более детального сравнения смотрите:

Производительность библиотеки даты / времени Java 8 (а также Joda-Time 2.3 и juCalendar). & Новый API даты и времени в Java 8

Joda-Time находится в режиме обслуживания

Нет прямого ответа на вопрос, но проект Joda-Time больше не находится в активной разработке. Команда предлагает пользователям перейти на более новый API java.time. См. Руководство Oracle.

На официальной странице проекта GitHub:

Joda-time больше не находится в активной разработке, за исключением обновления данных о часовых поясах. Начиная с Java SE 8 и далее пользователям предлагается перейти на java.time (JSR-310) - основную часть JDK, заменяющую этот проект. Для пользователей Android в API 26+ добавлен java.time. Проекты, которым необходимо поддерживать более низкие уровни API, могут использовать библиотеку ThreeTenABP.

Проектом совместно руководят автор Joda-Time (Стивен Колеборн) и Oracle под JSR 310, и он появится в новом пакете Java SE 8 java.time.

https://www.oracle.com/technical-resources/articles/java/jf14-date-time.html

Другие вопросы по тегам