Какой лучший способ манипулировать датами и отметками времени в 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.
Ключевыми классами являются:
Эта структура решает пару проблем, которые вы указали.
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?
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 под капотом. Вы сделаете это через день и никогда не пожалеете.