Чи варто використовувати заняття з датами та часом Java або йти з бібліотекою сторонніх організацій, наприклад Joda Time?


147

Я створюю веб-систему, яка буде використовуватися в країнах з усього світу. Один тип даних, який потрібно зберігати, - це дати та час.

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


5
Щоб уточнити деякі коментарі… Поки Joda-Time триває, його наступник JSR 310: API дати та часу дійсно планується бути частиною Java 8 під пакетом java.time . У Oracle є проект підручника . JDBC 4.2 буде обробляти нові типи даних.
Василь Бурк

Відповіді:


197

EDIT: Тепер, коли Java 8 випущена, якщо ви можете це використовувати, зробіть це! java.timeна мій погляд, навіть чистіше, ніж Joda Time. Однак якщо ви застрягли перед Java-8, читайте далі ...

Макс попросив плюси і мінуси використання Joda ...

Плюси:

  • Це працює, дуже добре. Я дуже підозрюю, що в Joda набагато менше помилок, ніж у стандартних бібліотеках Java. Деякі помилки в бібліотеках Java справді важко (якщо не неможливо) виправити завдяки дизайну.
  • Він створений для того, щоб заохотити вас думати про обробку дати та часу правильним способом - розділенням поняття "місцевий час" (наприклад, "розбуди мене о 7 ранку, де б я не був") та миттєвого часу ("Я дзвоню Джеймсу о 15:00 PST; він може бути не 15:00 там, де він є, але це той самий момент ")
  • Я вважаю , що це робить його більш легким для оновлення бази даних часового поясу, який робить зміни щодо часто
  • Він має історію хорошою незмінності, що робить життя багато простіше IME.
  • Усі формати форматів є безпечними для потоків, що чудово, оскільки ви майже завжди хочете повторно використовувати один форматер через додаток
  • Ви почнете вивчати мову java.timeJava 8, оскільки вони принаймні дещо схожі

Мінуси:

  • Це ще один API для навчання (хоча документи досить непогані)
  • Це ще одна бібліотека, яку потрібно створити проти та розгорнути
  • Коли ви використовуєте Java 8, ще є якась робота з переміщення ваших навичок
  • Мені не вдалося DateTimeZoneBuilderефективно використовувати в минулому. Це дуже рідкісний випадок використання.

Щоб відповісти на ідею oxbow_lakes щодо ефективного створення власного невеликого API, ось мої погляди, чому це погана ідея:

  • Це робота. Навіщо працювати, коли це вже зроблено для вас?
  • Новачок у вашій команді набагато частіше знайомий з Joda, ніж з вашим домашнім API
  • Ви, швидше за все, помилитесь за все, що перевищує найпростіші використання ... і навіть якщо ви спочатку вважаєте, що вам потрібен лише простий функціонал, ці речі мають звичку ускладнюватися, по одному крихітному. Маніпуляції з датою та часом важко зробити належним чином. Крім того, вбудовані API API важко використовувати належним чином - просто подивіться на правила роботи арифметики дати / часу API календаря. Побудувати що-небудь на цьому - це погана ідея, а не використання добре розробленої бібліотеки для початку.

5
@adi: Оновлено - воно все ще діє, але, сподіваємось, JSR-310 буде частиною Java 8, але вона не була частиною Java 7.
Jon Skeet

2
@JonSkeet Це, мабуть, має бути оновлено з моменту введення java-8
Sionnach733,

@ Sionnach733: Я не збираюсь оновлювати все це, але я додам щось на початку.
Джон Скіт

2
Є підтримка java.time.*для Java 6 і 7: threeten.org/threetenbp
Miscreant

24

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


Плюси і мінуси? Я ніколи не використовував час Джоди - було б цікаво почути, що люблять у ньому люди.
Макс Стюарт

15

Відповідь: це залежить

JODA (і JSR-310) - це повністю функціональна бібліотека дати / часу, включаючи підтримку для використання з декількома календарними системами.

Особисто я вважав, що JODA є надто далеко за складністю у тому, що мені потрібно. Дві основні помилки (IMHO) у стандартній Java Dateі Calendarкласах:

  1. Вони змінюються
  2. Вони поєднують концепцію року-місяця-дня з миттєвим часом

Незважаючи на те, що їх вирішує JODA, вам буде досить просто прокласти власні заняття для YearMonthDayтаInstant вони обидва використовують класи java під кришкою для фактичних "календаричних" обчислень. Тоді вам не доведеться ознайомлюватися з API> 100 класів, іншим механізмом форматування / розбору тощо.

Звичайно, якщо вам потрібне повне представлення різних хронологій (наприклад, іврит) або ви хочете мати змогу визначити власну уявну систему календаря (наприклад, для гри, яку ви пишете), можливо, для вас є JODA або JRS-310. Якщо ні, то я б припустив, що прокрутка вашого власного можливо це шлях.

Спеціалізація JSR-310 - Стівен Колбурн, який написав JODA на 1-му місці, тому логічно замінить JODA.


16
повинні НЕ бути заново нефахівцями, ІМО.
Джон Скіт

6
Я також не дебіл, але у мене все ще були проблеми з Java D&T API. Їх болісно легко використовувати. Причина, чому люди, швидше за все, зможуть правильно користуватися Joda, полягає в тому, що Joda краще розроблений - це спонукає вас робити правильно.
Джон Скіт

6
Я довіряю експерту в будь-який день тижня, коли мова йде про API / дати / час. Це не так, як це якийсь випадковий сторонній API, коли ніхто більше не використовує його. Аргумент "> 100 класів" - це солом'яна людина, тому що вам, очевидно, не потрібно їх усім вивчати.
Джон Скіт

5
Гадаю, нам доведеться погодитися на розбіжність. Будь-яка надійна дата / час, написана експертами та добре розроблена, що дозволяє уникнути мене брудної роботи з аргументом часу, з моєї точки зору вважається "обов'язковою". За останній рік я навчився з пристрастю ненавидіти вимірювання людського часу.
Джон Скіт

5
Прокатка свого, коли Джода існує, - просто жахлива ідея. Просто не робіть цього. Це правда, що у Джода є десятки занять, які ти не збираєшся використовувати, але відповідь на це досить проста - не використовуй тих, які тобі не потрібні. Існує так багато речей, які можуть піти не так, як написати свою власну бібліотеку такого типу - кількість зусиль, який ви повинні докладати, величезна, як в розробці, так і в тестуванні. Або ви можете просто додати одну бібліотеку. Тоді, Джода має додаткову перевагу, що нові рекрути у вашій команді, можливо, використовували її раніше, але вони не використали вашу домашню бібліотеку.
Dawood ibn Kareem

7

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


7

Вам слід використовувати бібліотеку Joda-Time, оскільки:

  1. Joda-Time підтримує стандарт ISO 8601 , що є стандартним способом подання
    дати.
  2. Додавання та віднімання дня / місяця / року у Joda-Time простіше, ніж java.util.date.
  3. Ініціалізація датою дати набагато простіше в Joda-Time.
  4. Joda-Time також підтримує часовий пояс.
  5. Joda-Time має кращий вбудований синтаксичний аналіз. Невірна дата, наприклад "2014-02-31", видається як помилка:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

Ця сторінка може вам сподобатися для отримання більш детальної інформації: http://swcodes.blogspot.com/

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