Час Джода проти Часу Java


19

Незважаючи на те, що Joda відрізняється великими можливостями та більш досконалим, ніж у стандартний час Java, це не завжди може бути найкращим у використанні. Як вирішити, чи слід використовувати Joda Time або Java Time в будь-якому коді Java?

Чи є якась настанова, яка говорить нам, як вибрати правильний залежно від наших вимог?


5
Отримайте найкраще з обох світів за допомогою нового API дати та часу, включеного в Java 8 . На нього сильно впливає Joda Time. Насправді головним автором є Стівен Колбурн, автор Joda Time.
Йоахім Зауер

1
@JoachimSauer Чи з'явився він у остаточному випуску чи це станеться, коли запуститься Java 8?
m3th0dman

@ m3th0dman: він буде включений до остаточного випуску Java 8, він ще не вийшов. GA наразі призначений на 2013-09-09 .
Йоахім Зауер

Класи java.time, вбудовані в Java 8, Java 9 та новіші версії , тепер застаріли і класи Joda -Time, і початкові класи дат-часу Java.
Василь Бурк

Відповіді:


29

Joda Time - це таке вдосконалення порівняно з бібліотекою часу Java, що майже завжди є правильним вибором, крім наступних винятків:

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

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

Однак у випадку 2) все-таки краще використовувати Joda, якщо можливо, внутрішньо.

Вищезазначені речі варто пам’ятати, але вони повинні бути рідкісними. Якщо сумніваєтеся, їдьте з Джодою.


Скажіть, будь ласка, що означає "використовувати Joda внутрішньо". Я початківець і не знаю всіх цих речей.
лицар-джедай

5
@Jedi Knight: це означає, що програма використовує Joda за власною логікою і перетворюється в / з java.util.Date лише тоді, коли він спілкується із зовнішньою системою, яка цього вимагає.
Майкл Боргвардт

2
За „внутрішнім” він може бути внутрішнім для додатка в цілому (як у прикладі Майкла), але він може бути внутрішнім для класу або просто певного методу. Скажімо, наприклад, що у вас є утилітний метод, який займає два об’єкти Java-дати та обчислює кількість робочих днів між ними, але він містить помилку. Щоб виправити це, може бути простіше переписати цей метод, використовуючи JodaTime замість цього, але ви, можливо, не зможете дозволити собі час перефактурувати весь код, який викликає метод, тому ви залишаєте підпис методу незмінним. У цьому випадку ви використовуєте Джоду "внутрішньо" в цьому методі.
Роберт Джонсон

FYI, проект 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 також має ручку SO ...

Я думаю, що можна впевнено стверджувати, що ми можемо відчувати себе втішеними та безпечними завдяки новому API дати та часу, передбаченому в Java 8 .

Деякі додаткові посилання:


12

API стандартної дати Java настільки принципово порушений, що я часто вважав просто додавати час Joda до розширень бібліотеки JVM, щоб він завантажувався на класний шлях за замовчуванням з рештою Java API.

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

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

1) Моторний катер, який доставить вас на острів всього за 6 хвилин.

Або ...

2) Самостійний бамбуковий пліт, пов'язаний разом з лозою під час урагану, керованого божевільним хлопцем, кращим другом якого є волейбол.

Як було зазначено в інших відповідях, нечисленні недоліки, такі як ORM, навіть не існують, оскільки в режимі Hibernate тепер є плагіни, які дозволяють властивостям типу бода Joda відображатись у поля дати / часу бази даних. JPA також може відповісти на це.

Якщо ваше бажання полягає у тому, щоб ваша програма мала мінімалістичний слід як настільний додаток, оскільки воно стосується дискового простору, можливо, Java навіть не є правильним вибором мови.


FYI, проект Joda-Time зараз перебуває в режимі обслуговування , команда радить перейти до класів java.time . Дивіться Підручник від Oracle .
Василь Бурк

8

Ще один момент: Java-Time (тобто Date) - це не ThreadSafe, а JodaTime. Тому JodaTime надається перевагу, коли вимоги подобаються

  • Багатопотокове середовище, що отримує доступ до загальних ресурсів
  • Централізована синхронізація часу, як ситуації

Або ж для простих додатків Java-Time добре.


Навіть DateTime також не є ThreadSafe, чи не так? Виправте мене, якщо я помиляюся.
Вінтеш

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.Дати до типу "java.time"? .

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

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями.

Значна частина функцій java.time підтримується на Java 6 і 7 у ThreeTen-Backport і надалі адаптується до Android у ThreeTenABP (див. Як користуватися… ).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.