Какой лучший способ манипулировать датами и отметками времени в Java?

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

  • 0 месяцев. Я понимаю, что лучше всего использовать Calendar.SEPTEMBER вместо 8, но это раздражает, что 8 представляет собой сентябрь, а не август.

  • Получение даты без отметки времени. Мне всегда нужна утилита, которая Zeros выводит часть времени даты.

  • Я знаю другие проблемы, которые у меня были в прошлом, но не могу вспомнить. Не стесняйтесь добавлять больше в свои ответы.

Итак, мой вопрос... Какие сторонние API вы используете для упрощения использования Java манипуляций Date и Time, если таковые имеются? Любые мысли об использовании Joda? Кто-нибудь посмотрел ближе к API-интерфейсу даты и времени JSR-310?

Ответ 1

В этом сообщении есть хорошая дискуссия о сравнении API Java Date/Time и JODA.

Я лично просто использую Григорианский календарь и SimpleDateFormat в любое время, когда мне нужно манипулировать датами/временем в Java. У меня никогда не было никаких проблем с использованием Java API и найти его довольно простым в использовании, поэтому на самом деле не рассматривались альтернативы.

Ответ 2

java.time

Java 8 и более поздние версии теперь включают java.time. Вдохновленный Joda-Time, определенный JSR 310, расширенный проектом ThreeTen-Extra. См. Учебник.

Эта структура заменяет старые классы java.util.Date/.Calendar. Методы конвертации позволяют вам конвертировать назад и вперед для работы со старым кодом, еще не обновленным для типов java.time.

Ключевыми классами являются:

  • Instant
    Момент на шкале времени, всегда в UTC.
  • ZoneId
    Часовой пояс. Подкласс ZoneOffset включает константу для UTC.
  • ZonedDateTime= Instant + ZoneId
    Представляет момент на шкале времени, скорректированной в определенный часовой пояс.

Эта структура решает пару проблем, которые вы указали.

0-месячные месяцы

Число месяцев: 1-12 в java.time.

Еще лучше, Enum (Month) предоставляет экземпляр объекта для каждого месяца года. Поэтому вам не нужно зависеть от "волшебных" чисел в вашем коде, например 9 или 10.

if ( theMonth.equals ( Month.OCTOBER ) ) {  …

Кроме того, это перечисление включает некоторые полезные полезные методы, такие как получение локализованного имени месяца.

Если вы еще не знакомы с перечислениями Java, прочитайте Tutorial и изучите. Они удивительно удобны и мощны.

Дата без времени

Класс LocalDate представляет собой значение только для даты, без времени суток, без часового пояса.

LocalDate localDate = LocalDate.parse( "2015-01-02" );

Обратите внимание, что для определения даты требуется часовой пояс. Новый день наступает раньше в Париже, чем в Монреале, где он все еще "вчера". Класс ZoneId представляет часовой пояс.

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );

Аналогично, существует класс LocalTime для времени, которое еще не привязано к дате или часовому поясу.


О java.time

Структура java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы даты-времени, такие как java.util.Date, Calendar и SimpleDateFormat.

Проект Joda-Time, теперь режим обслуживания, советуем перейти к классам java.time.

Чтобы узнать больше, см. Учебник Oracle. И поиск Qaru для многих примеров и объяснений. Спецификация JSR 310.

Где получить классы java.time?

  • Java SE 8, Java SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в ThreeTen-Backport.
  • Android

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

Ответ 3

Проект Apache Commons Lang имеет класс DateUtils, который выполняет полезные операции Date.

Я использую DateUtils.truncate() много, что будет "обнулить" части Даты для вас (полезно, если вы хотите, чтобы ваш объект Date, например, представлял дату и не включал информацию о времени). Каждый метод работает и для объектов Date и Calendar.

http://commons.apache.org/lang/

Ответ 4

Я использую Joda исключительно в течение трех лет и определенно рекомендую его - у него есть вся область, покрытая интерфейсом, который "делает то, что он говорит".

Joda может выглядеть сложной, когда вы начинаете, например, у нее есть понятия периодов, продолжительности и интервалов, которые выглядят похожими, но вы можете начать просто путем замены org.joda.time.DateTime (или org.joda.time.DateMidnight) на java.util.Date в ваш код и придерживайтесь многих полезных методов, которые содержатся в этих классах, прежде чем понимать другие области.

Ответ 5

Я использую GregorianCalendar - всегда и везде. Простой java.util.Date слишком сложный, да.

Итак, мой совет: используйте GC, его простой

Ответ 6

Это то же самое в javascript. Кто-то, должно быть, курил что-то, когда они думают, что это хорошая идея, чтобы 2008 год означал год 2008, 31 означает 31-й день в месяце, и - это лучшая часть - 11 означает 12-й месяц.

С другой стороны, они получили это право на два из трех.

Ответ 7

Вещь, которая всегда получает меня с Java, - это библиотека времени. Я никогда не использовал Joda, просто на короткое время смотрю на это, выглядит как неплохая реализация, и если я правильно понимаю JSR-130, то он должен получить знания от Joda и, в конечном итоге, включить его в JavaSE.

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

Ответ 8

API-интерфейсы Date очень сложно разработать, особенно если им приходится иметь дело с локализацией. Попытайтесь бросить свои собственные и увидеть, это стоит делать хотя бы один раз. Тот факт, что Джода смог сделать такую ​​хорошую работу, является настоящим кредитом для ее разработчиков. Чтобы ответить на ваш вопрос, я ничего не слышал об этой библиотеке, но я никогда не играл с ней сам.

Ответ 9

Многие программисты начинают использовать Date, у которой есть множество устаревших перегруженных конструкторов (что затрудняет их использование), но как только вы выберете GregorianCalendar, становится немного легче управлять. Пример здесь очень полезен:

http://java.sun.com/j2se/1.4.2/docs/api/java/util/GregorianCalendar.html

Ответ 10

Очень просто написать собственный API-интерфейс даты, который находится поверх исходных классов Java, Date и Calendar. В принципе, дата и календарь страдают от того, что они пытаются втиснуть две концепции в один класс:

  • Дата (т.е. год-месяц-день)
  • Мгновенный (т.е. currentTimeMillis)

Когда вы это поймете, он просто изменит, как вы обрабатываете концепции, подобные дате в вашем коде. Все будет проще, яснее, лучше. Во всех смыслах!

Для меня Йода слишком сложна, по крайней мере, для подавляющего большинства целей, и мне особенно не нравится тот факт, что они пошли против стандартных форм Java, одним из примеров является то, как они анализируют и форматируют даты. Стивен Коулборн, парень, стоящий за JODA, является спецификацией JSR-310, и это страдает от тех же проблем imho (я следил и участвовал в дискуссиях за последние несколько лет).

Сделай это сам; это легко. Просто заполните следующие классы: MyDate (wrapping year-month-day), Month (enum), TimeOfDay (hour-min-sec-millis), DayOfWeek (перечисление), Instant (завершение длинного). Всегда учитывайте часовые пояса при конвертации между экземплярами и датами.

Если это кажется сложным, вы можете использовать Calendar и SimpleDateFormat под капотом. Вы сделаете это через день и никогда не пожалеете.