Должен ли я использовать классы даты и времени Java или использовать стороннюю библиотеку, такую ​​как Joda Time?

147

Я создаю веб-систему, которая будет использоваться в странах со всего мира. Одним из типов данных, которые должны быть сохранены, являются даты и время.

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

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

Ответы:

197

РЕДАКТИРОВАТЬ: Теперь, когда Java 8 была выпущена, если вы можете использовать это, сделайте это! java.timeдаже чище, чем Joda Time, на мой взгляд. Однако, если вы застряли до Java-8, читайте дальше ...

Макс спросил о плюсах и минусах использования Joda ...

Плюсы:

  • Это работает, очень хорошо. Я сильно подозреваю, что в Joda гораздо меньше ошибок, чем в стандартных библиотеках Java. Некоторые ошибки в библиотеках Java действительно трудно (если не невозможно) исправить из-за дизайна.
  • Он предназначен для того, чтобы побудить вас думать об обработке даты / времени правильным образом - разделяя понятие «местное время» (например, «разбуди меня в 7 утра, где бы я ни был») и мгновение во времени («я звоню Джеймсу»). в 3 часа дня по тихоокеанскому времени; возможно, это не 3 часа дня, где он, но это то же самое мгновение ")
  • Я считаю , что это делает его более легким для обновления базы данных часового пояса, который делает изменения относительно часто
  • У этого есть хорошая история неизменности, которая делает жизнь намного легче IME.
  • Исходя из неизменности, все форматеры являются поточно-ориентированными, что прекрасно, потому что вы почти всегда хотите повторно использовать один форматер через приложение
  • Вы будете иметь преимущество в изучении java.timeJava 8, так как они хотя бы немного похожи

Минусы:

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

Чтобы ответить на идею oxbow_lakes по эффективному созданию собственного небольшого API, вот мое мнение о том, почему это плохая идея:

  • Это работает. Зачем работать, когда это уже сделано для тебя?
  • Новичок в вашей команде гораздо чаще знаком с Joda, чем с вашим доморощенным API
  • Скорее всего, вы ошибетесь в чем-то, кроме простейшего использования ... и даже если вы изначально думаете, что вам нужна только простая функциональность, эти вещи имеют привычку усложняться, чуть-чуть за раз. Манипуляции с датой и временем трудно сделать правильно. Кроме того, встроенные Java API трудно использовать должным образом - просто посмотрите на правила работы арифметики API календаря по дате и времени. Создавать что-либо поверх них - плохая идея, а не использовать хорошо спроектированную библиотеку для начала.
Джон Скит
источник
5
@adi: Обновлено - все еще действует, но, надеюсь, JSR-310 будет частью Java 8, но не была частью Java 7.
Джон Скит
2
@JonSkeet Это, вероятно, следует обновить с момента появления java-8
Sionnach733
@ Sionnach733: Я не собираюсь обновлять все это, но я добавлю кое-что в начале.
Джон Скит
2
Существует бэкпорт java.time.*для Java 6 и 7: threeten.org/threetenbp
Miscreant
24

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

штуковина
источник
Плюсы и минусы? Я никогда не использовал время Joda - было бы интересно услышать, что людям нравится в этом.
Макс Стюарт
15

Ответ: это зависит

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

Лично я обнаружил, что JODA слишком далеко зашел с точки зрения сложности для того, что мне нужно. 2 основные (ИМХО) ошибки в стандартных java Dateи Calendarклассах:

  1. Они изменчивы
  2. Они смешивают концепцию год-месяц-день из мгновенного времени

Несмотря на то, что они решаются JODA, вы обнаружите, что довольно легко свернуть свои собственные классы для YearMonthDayи Instant, которые используют классы java под капотом для реальных «календарных» вычислений. Тогда вам не нужно знакомиться с API более 100 классов, другим механизмом форматирования / разбора и т. Д.

Конечно, если вам нужно полное представление различных хронологий (например, иврит) или вы хотите иметь возможность определить свою собственную воображаемую систему Календаря (например, для игры, которую вы пишете), то, возможно, JODA или JRS-310 для вас. Если нет, то я бы предположил, что кататься по-своему - это, возможно, путь.

Лидером по спецификации JSR-310 является Стивен Колебурн, который написал JODA на первом месте, поэтому логически заменит JODA.

oxbow_lakes
источник
16
не должен быть заново изобретен неспециалистами, ИМО.
Джон Скит
6
Я тоже не дебил, но у меня все еще были проблемы с API Java D & T. Их мучительно легко неправильно использовать. Причина, по которой люди с большей вероятностью смогут правильно использовать Joda, заключается в том, что Joda лучше спроектирован - он побуждает вас делать правильные вещи.
Джон Скит
6
Я доверяю эксперту над собой в любой день недели, когда дело доходит до API даты / времени. Это не похоже на случайный сторонний API, которым никто не пользуется. Аргумент "> 100 классов" - соломенный человек, потому что вам, очевидно, не нужно изучать их все.
Джон Скит
5
Я думаю, что мы должны согласиться, чтобы отличаться. Любая заслуживающая доверия дата / время, написанная экспертами и хорошо продуманная, которая избавляет меня от необходимости выполнять грязную работу с указанием времени, с моей точки зрения считается «обязательной». За последний год я научился ненавидеть человеческое измерение времени со страстью.
Джон Скит
5
Раскатать себя, когда Джода существует, просто ужасная идея. Просто не делай этого. Это правда, что у Joda есть десятки классов, которые вы не собираетесь использовать, но ответ на этот вопрос довольно прост - не используйте те, которые вам не нужны. Есть много вещей, которые могут пойти не так при написании вашей собственной библиотеки этого типа - количество усилий, которое вам придется приложить, огромно, как при разработке, так и при тестировании. Или вы можете просто добавить одну библиотеку. Кроме того, у Joda есть дополнительное преимущество, заключающееся в том, что новобранцы вашей команды могли использовать его раньше, но они не использовали вашу доморощенную библиотеку.
Дауд ибн Карим
7

Все зависит от того, что вы делаете с датами. Если вы просто сохраняете их, то встроенные в Dates 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/

гость
источник