Получение объекта Date без времени в Java: эффективный способ
Быстрый ответ
Если вам требуется только текущая дата без указания времени, воспользуйтесь классом LocalDate
:
LocalDate date = LocalDate.now();
LocalDate
пришёл в пакете java.time
и предназначен только для операций с датой.
Немного о работе с датой в Java без указания времени
Познакомимся с LocalDate
из пакета java.time
, входящим в стандартную библиотеку Java. Воспользоваться LocalDate
— это простой и рациональный способ получить дату без учёта времени.
Устаревшие классы и java.time
Раньше для работы с датой и временем в Java обычно использовались java.util.Date
и Calendar
. Однако эти классы мутабельны, что может усложнять работу разработчиков и приводить к ошибкам.
Важность учёта часового пояса
Точное управление датами в разных регионах потребует учёта часового пояса. Специфицируйте его при получении LocalDate
:
LocalDate today = LocalDate.now(ZoneId.of("UTC"));
Тем самым вы гарантируете правильный вывод даты для конкретного часового пояса.
Взаимодействие с базами данных
Для общения с базами данных, которые работают только с датами, полезно использовать классы из пакета java.time
или Joda Time. Это защитит ваши транзакции от путаницы по часовым поясам и переходу на летнее время.
Повышение производительности
В интересах производительности стоит избегать создания лишних временных объектов. Возможно, вам придётся обрезать время у объектов java.util.Date
напрямую:
java.util.Date date = DateUtils.truncate(new java.util.Date(), Calendar.DATE);
Функция DateUtils
из Apache Commons возвращает обрезанный объект java.util.Date
, что позволяет уменьшить число объектов.
Обратная совместимость
Разработчики, работающие на Java 6 или 7, могут использовать библиотеку ThreeTen-Backport вместо java.time
. В случае Android рекомендуется проект ThreeTenABP.
Визуализация
Представим старую фотографию, точно замаркированную датами и временами. Наша задача заключается в том, чтобы стереть временные метки, оставив только даты:
Оригинал: 🖼️📆🕒📆🕒📆🕒
Устраняем временные метки:
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
date = cal.getTime();
И финальное изображение представляет исторический момент только со днём:
Итог: 🖼️
Использование SimpleDateFormat
при необходимости
В определённых случаях всё же может потребоваться SimpleDateFormat
, но имейте в виду его особенности и ограниченную эффективность.
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dateWithoutTime = sdf.parse("25/12/2023");
Ясность кода
Ваши намерения должны быть ясны: если вам нужна дата без времени, используйте LocalDate
. Это упрощает чтение кода и снижает вероятность ошибок.
Расширенные возможности java.time
Если вам не хватает функционала базовых классов java.time
, проект ThreeTen-Extra предоставляет дополнительные инструменты для расширения капабилитиз этого фреймворка.
Полезные материалы
- LocalDate (Java Platform SE 8) — официальная документация.
- SimpleDateFormat (Java Platform SE 7) — информация об форматировании даты.
- Joda-Time – Home — руководство по Joda-Time.
- Date Classes (The Java™ Tutorials > Date Time > Standard Calendar) — руководство по API даты и времени Java 8.
- DZone — переход с Joda-Time на
java.time
.