Как лучше всего манипулировать датами и временными метками в Java? - PullRequest
15 голосов
/ 18 сентября 2008

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

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

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

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

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

Ответы [ 10 ]

10 голосов
/ 18 сентября 2008

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

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

5 голосов
/ 29 октября 2015

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, прочитайте учебник и изучите его. Они удивительно удобны и мощны.

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

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

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

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

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

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


О java.time

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

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

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

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

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

3 голосов
/ 18 сентября 2008

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

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

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

2 голосов
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

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

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

1 голос
/ 18 сентября 2008

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

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

0 голосов
/ 18 сентября 2008

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

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

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

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

Сделай сам; это просто. Просто заполните следующие классы: MyDate (перенос года-месяца-дня), Месяц (перечисление), TimeOfDay (час-минуты-секунды-миллис), DayOfWeek (перечисление), Instant (перенос длинной) Всегда учитывайте часовые пояса при конвертации между Instants и Dates.

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

0 голосов
/ 18 сентября 2008

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

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

0 голосов
/ 18 сентября 2008

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

...