Различия между 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 ответа:
общие характеристики
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 Дата / Время:
- классы Java 8 построены вокруг человеческого времени. Это делает их быстро для человека datetime арифметики / преобразования.
- дата / время компонент геттеры, как
getDayOfMonth
имеют O (1) сложность в реализации Java 8.- парсинг
OffsetDateTime
/OffsetTime
/ZonedDateTime
очень медленно в Java 8 ea b121 из-за исключений, брошенных и пойманных внутренне в JDK.- набор пакетов:
java.time.*
,java.time.chrono.*
,java.time.format.*
,java.time.temporal.*
,java.time.zone.*
- мгновения (временные метки) дата и время частичный парсер даты и времени и форматер часовых поясов разные хронологии (календари).
- существующие классы имеют проблемы, такие как дата не поддерживает I18N или L10N. они изменчивы!
- проще и надежнее.
- часы можно впрыснуть.
- часы могут быть созданы с различными свойствами-статические часы, издевались часы, часы низкой точности (весь секунд, целые минуты, и т. д.).
- часы могут быть созданы с определенными часовыми поясами.
Clock.system(Zone.of("America/Los_Angeles"))
.- позволяет проверить дату и время обработки кода.
- делает тесты независимыми от часового пояса.
Joda Времени :
- Joda-Time использует машинное время внутри. Ручная реализация на основе значений int / long будет намного быстрее.
- Joda времени добытчики требуют от компьютера к человеку время расчет на каждый вызов геттера, что делает Joda-Time узким местом в таких сценариях.
- он состоит из неизменяемых классов он обрабатывает мгновения, дату и время, частичные и длительности он является гибким он хорошо разработан.
- представляет даты, как мгновения. Но дата и время могут соответствовать более чем одному моменту времени. Перекрытие час, когда летнее время заканчивается. Как и вообще не иметь ни одного мгновения, что ему соответствует. Перерыв час, когда начинается дневной свет. Должен выполнить сложные вычисления для простых операций.
- принимает значения NULL в качестве допустимых значений для большинства своих методов. Приводит к тонким ошибкам.
для более детального сравнения см.: -
производительность библиотеки даты и времени Java 8 (а также Joda-Time 2.3 и J.u.Calendar). & новый API даты и времени в Java 8