Время Йода против Время Ява

19

Хотя Joda является многофункциональным и более сложным, чем стандартное время Java, это не всегда может быть лучшим вариантом для использования. Как я могу решить, следует ли мне использовать Joda Time или Java Time в любом коде Java?

Есть ли какое-то руководство, которое подсказывает нам, как выбрать правильное в зависимости от наших требований?

Рыцарь джедай
источник
5
Получите лучшее из обоих миров, используя новый API Date & Time, включенный в Java 8 . Это сильно зависит от Joda Time. На самом деле основным автором является Стивен Колебурн, автор Joda Time.
Йоахим Зауэр
1
@JoachimSauer Появился ли он в финальной версии или это произойдет, когда запустится Java 8?
m3th0dman
@ m3th0dman: он будет включен в финальную версию Java 8, еще не выпущен. GA в настоящее время запланировано на 2013-09-09 .
Иоахим Зауэр
Joda-Time и исходные классы даты и времени Java теперь устарели из-за классов java.time, встроенных в Java 8, Java 9 и более поздние версии .
Базилик Бурк

Ответы:

29

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

  1. Когда трудно или нежелательно добавлять сторонние зависимости в ваш проект

  2. Когда его использование в общедоступном интерфейсе может вызвать проблемы, например, получение ORM для обработки полей времени java и Joda.

Тем не менее, в случае 2) было бы лучше использовать Joda для внутреннего использования, если это возможно.

Вышеуказанные вещи стоит иметь в виду, но они должны быть редкими. Если сомневаешься, иди с Йодой.

Роберт Джонсон
источник
Пожалуйста, скажите мне, что означает «использовать Йоду внутри». Я новичок, и я не знаю всех этих вещей.
Рыцарь-джедай
5
@Jedi Knight: это означает, что приложение использует Joda для своей собственной логики и конвертирует в / из java.util.Date только тогда, когда оно связывается с внешней системой, которая этого требует.
Майкл Боргвардт
2
Под «внутренним» оно может быть внутренним для приложения в целом (как в примере Майкла), но оно может быть внутренним для класса или просто для конкретного метода. Скажем, например, что у вас есть служебный метод, который берет два объекта Java Date и вычисляет количество рабочих дней между ними, но он содержит ошибку. Чтобы исправить это, вполне может быть проще переписать этот метод, используя вместо этого JodaTime, но вы не сможете выделить время для рефакторинга всего кода, который вызывает метод, поэтому вы оставляете сигнатуру метода без изменений. В этом случае вы используете Joda "внутренне" в этом методе.
Роберт Джонсон
К вашему сведению, проект Joda-Time сейчас находится в режиме обслуживания , и команда советует перейти на классы java.time . Смотрите Учебник по Oracle .
Василий Бурк
13

Обратите внимание, что на сайте Joda-Time говорится:

Стандартные классы даты и времени до Java SE 8 плохие. Решая эту проблему, Joda-Time стала де-факто стандартной библиотекой даты и времени для Java. Обратите внимание, что начиная с Java SE 8 и далее пользователям предлагается перейти на java.time (JSR-310).

Основной участник Joda-Time , jodastephen , также является основным разработчиком JSR-310, что можно увидеть в репозитории GitHub, связанном с http://www.threeten.org/ . Кстати, у jodastephen есть также ТАК ручка ...

Я думаю, можно с уверенностью утверждать, что мы можем чувствовать себя комфортно и безопасно с новым API даты и времени, который предоставляется в Java 8 и более поздних версиях.

Некоторые дополнительные ссылки:

Йо Йо
источник
12

Стандартный API даты Java настолько принципиально сломан, что я часто рассматривал простое добавление Joda Time к расширениям библиотеки JVM, чтобы он загружался в путь к классам по умолчанию вместе с остальной частью Java API.

Если вам когда-либо было поручено преобразовать интернационализацию и часовые пояса в унаследованное Java-приложение и вы пытались использовать только стандартный Java API, вы поймете, что я имею в виду. Мне удалось превратить тысячи строк кода в менее сотни. Повышение производительности немыслимо.

Кроме того, стандартное API даты не является интуитивно понятным, поскольку жидкое API Joda можно получить за часы, а не за недели. Ваша аналогия с попыткой добраться до острова, который находится в двух милях, более похожа на следующее.

1) Моторная лодка, которая доставит вас на остров всего за 6 минут.

Или...

2) Самодельный бамбуковый плот, связанный вместе с виноградными лозами во время урагана, которым управляет сумасшедший парень, лучший друг которого - волейбол.

Как уже отмечалось в других ответах, некоторые недостатки, такие как ORM, даже становятся несуществующими, поскольку в Hibernate теперь есть плагины, которые позволяют сопоставлять свойства bean-компонентов типа Joda с полями даты / времени базы данных. JPA также может иметь ответ на этот вопрос.

Если вы хотите, чтобы ваше приложение было минималистичным, как настольное приложение, поскольку оно касается дискового пространства, то, возможно, Java даже не является правильным выбором языка.

maple_shaft
источник
К вашему сведению, проект Joda-Time сейчас находится в режиме обслуживания , и команда советует перейти на классы java.time . Смотрите Учебник по Oracle .
Василий Бурк
8

Еще один момент: Java-Time (т.е. Date) не является ThreadSafe, а JodaTime. Поэтому JodaTime предпочтительнее, когда такие требования, как

  • Многопоточная среда доступа к общим ресурсам
  • Централизованная синхронизация времени как ситуации

Или для простых приложений Java-Time это нормально.

vintesh
источник
Даже DateTime также не ThreadSafe, не так ли? Поправь меня, если я ошибаюсь.
vintesh
3
Подавляющее большинство библиотеки Joda, включая класс DateTime, является неизменным и, следовательно, потокобезопасным. Однако есть несколько изменяемых классов, которые не являются потокобезопасными. См. Joda-time.sourceforge.net/faq.html#threading .
Роберт Джонсон
1
Поток безопасности для java.timeреализуется через неизменяемость. См. Stackoverflow.com/questions/9303532/… . Это хорошо работает как для простых, так и для сложных приложений. Даже api doc утверждает, что «Все классы являются неизменяемыми и поточно-ориентированными» (буквально цитируется во втором абзаце). У старых java.utilклассов, с другой стороны, есть несколько проблем. Я понимаю, что этот ответ относится к последнему, но важно сделать это различие сейчас.
YoYo
Не представлять дату и время как неизменные значения просто безумие. Я знаю, что это сейчас исправлено, но на самом деле, о чем они думали?
Алуан Хаддад
2

Java.time структура заменяет как устаревшие классы даты и времени и Joda-Time

Обновление: старые классы даты и времени, поставляемые с самыми ранними версиями Java, теперь унаследованы, официально заменены классами java.time, встроенными в Java 8, Java 9 и более поздние версии .

Date, Calendar, SimpleDateFormat, И java.sql.*классы даты и времени все должны избегать. Нет необходимости использовать эти запутанные, хлопотные, плохо разработанные классы. Они полностью заменены классами java.time. Теперь их единственная цель - поддерживать существующий старый код. При взаимодействии со старым кодом вы можете конвертировать в / из java.time, вызывая новые методы, добавленные к старым классам. Для получения дополнительной информации о преобразовании см .: Преобразование java.util.Date в тип «java.time»? ,

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time . Проект Joda-Time вдохновил фреймворк java.time. Оба возглавляются одним и тем же человеком, Стивеном Коулборном . Вы можете думать о java.time как о переписывании / редизайне Joda-Time, всего нового кода, но с использованием того, что было изучено за годы создания первой в отрасли комплексной и сложной библиотеки дат и времени.

Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать… ).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval, YearWeek, YearQuarter, и более .

Базилик Бурк
источник