Различия между Java 8 Date Time API (java.время) и Джода-время


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

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

  • что может java.время делает то, что Джода-время не может?
  • что может java.время сделать лучше, чем Джода-время?
  • производительность лучше с java.время?
2 226

2 ответа:

общие характеристики

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

B) кроме того: обе библиотеки вдохновлены дизайнерским исследованием "TimeAndMoney" от Эрика Эванса или идеи от Martin Fowler о домене driven style поэтому они более или менее стремятся к свободный стиль программирования (хотя и не всегда идеальные ;-)).

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

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

производительность

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

Null

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

точность

ручки JSR-310 НС точность в то время как Джода-время ограничено МС точности.

поддерживаемых полей:

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

перечисление

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

Zone API

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

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

регулятор и свойство

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

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

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

календарных систем

JSR-310 предлагает 4 дополнительных системы календаря. Самый интересный из них Umalqura (используется в Саудовской Аравии). Остальные 3: Миньго (Тайвань), японский (только современный календарь с 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-style очевидно, лучше (и долго на основе вместо использования int):

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

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

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

интервалы

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

форматирование и разбор

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

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

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

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

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


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

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

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

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

  1. классы Java 8 построены вокруг человеческого времени. Это делает их быстро для человека datetime арифметики / преобразования.
  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. существующие классы имеют проблемы, такие как дата не поддерживает I18N или L10N. они изменчивы!
  7. проще и надежнее.
  8. часы можно впрыснуть.
  9. часы могут быть созданы с различными свойствами-статические часы, издевались часы, часы низкой точности (весь секунд, целые минуты, и т. д.).
  10. часы могут быть созданы с определенными часовыми поясами. Clock.system(Zone.of("America/Los_Angeles")).
  11. позволяет проверить дату и время обработки кода.
  12. делает тесты независимыми от часового пояса.

Joda Времени :

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

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

производительность библиотеки даты и времени Java 8 (а также Joda-Time 2.3 и J.u.Calendar). & новый API даты и времени в Java 8