Анотація від перекладача
Отже, давайте обрисуємо проблему - порівняння об'єктів 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.