Переклад способи порівняння об'єктів дат в java, stokito on software

Анотація від перекладача

Отже, давайте обрисуємо проблему - порівняння об'єктів Date в Java відомий джерело помилок.
Це з'являється в стандартному коді, але також буває і в якому тестують коді, де нам регулярно потрібно створювати об'єкти Date які відзначають певний момент часу на який потім будемо посилатися в порівнянні.

В якому тестують коді я не переживав що використовую застарілі (deprecated) методи. Тому я використовував старий конструктор Date щоб форматувати дати, після чого я порівнював їх з іншим об'єктами дат через метод порівняння equals ():

канонічний спосіб

Починаючи з Java 1.1 в Java API був доданий клас Calendar щоб розділити момент у часі (тобто дату) від її уявлення в специфічному довіднику (календар). Наступний фрагмент коду (snippet) це спосіб отримання такого ж результату як вище.

Це не тільки більш багатослівно, тут також є помилка: годинник, хвилин і інше не дорівнює нулю (береться від моменту безпосереднього створення календаря), тому порівняння через equals () буде повертати false. Ось правильний код:

Щонайменше це погіршує стислість 😉

Apache Commons Lang

Apache Commons спочатку надає різні утілітние бібліотеки які полегшують розробку в Java. Одна з таких бібліотек Apache Commons Lang яка надає функціонал який заслуговує бути частиною Java API. У нашому випадку клас DateUtils дозволить нам скоротити код зберігши при цьому його читаність:

Навіть краще, DateUtils дозволяє нам працювати безпосередньо з об'єктами Date в такому альтернативному виді:

Зверніть увагу що він залишає параметри недоторканими, досягаючи незмінності (immutability) по принципу функціонального програмування.
Переваги: ​​ми використовуємо стандартне Java API.
Недоліки: так ніяких. І ще, чи не буде повністю своєрідний DSL здаватися чимось більш підходящим?

Останній варіант це використання бібліотеки Joda Time. яка націлена стати заміною для Date і Calendar. Вона також породила JSR-310 - новий і покращений API для маніпуляції з датою і часом, який повинен стати частиною Java 8 (він був спочатку запланований для Java 7). Joda Time варто присвятити окрему статтю (або навіть міні-керівництво). Для наших поточних потреб наступний фрагмент коду може вигідно замінити наш споконвічний:

Якщо порівнювати з першим прикладом, такий код здається чистіше і лаконічніше. І ще, параметри самоопісивающіе, немає реальної потреби регулярно перевіряти JavaDocs щоб дізнатися як инициализируется рік. Крім того, семантика імен класів ясна. І нарешті, метод toDate () дає нам міст до стандартного Java API.

висновок

Висновок робіть самі. Особисто я зазвичай використовую Apache Commons Lang, але останнім часом схиляюся до Joda Time. Архів з прикладами коду доступний для скачування тут у вигляді Maven проекту під Eclipse.