Получение объекта Date без времени в Java: эффективный способ

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если вам требуется только текущая дата без указания времени, воспользуйтесь классом LocalDate:

Java
Скопировать код
LocalDate date = LocalDate.now();

LocalDate пришёл в пакете java.time и предназначен только для операций с датой.

Кинга Идем в IT: пошаговый план для смены профессии

Немного о работе с датой в Java без указания времени

Познакомимся с LocalDate из пакета java.time, входящим в стандартную библиотеку Java. Воспользоваться LocalDate — это простой и рациональный способ получить дату без учёта времени.

Устаревшие классы и java.time

Раньше для работы с датой и временем в Java обычно использовались java.util.Date и Calendar. Однако эти классы мутабельны, что может усложнять работу разработчиков и приводить к ошибкам.

Важность учёта часового пояса

Точное управление датами в разных регионах потребует учёта часового пояса. Специфицируйте его при получении LocalDate:

Java
Скопировать код
LocalDate today = LocalDate.now(ZoneId.of("UTC"));

Тем самым вы гарантируете правильный вывод даты для конкретного часового пояса.

Взаимодействие с базами данных

Для общения с базами данных, которые работают только с датами, полезно использовать классы из пакета java.time или Joda Time. Это защитит ваши транзакции от путаницы по часовым поясам и переходу на летнее время.

Повышение производительности

В интересах производительности стоит избегать создания лишних временных объектов. Возможно, вам придётся обрезать время у объектов java.util.Date напрямую:

Java
Скопировать код
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.

Визуализация

Представим старую фотографию, точно замаркированную датами и временами. Наша задача заключается в том, чтобы стереть временные метки, оставив только даты:

plaintext
Скопировать код
Оригинал: 🖼️📆🕒📆🕒📆🕒

Устраняем временные метки:

Java
Скопировать код
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();

И финальное изображение представляет исторический момент только со днём:

plaintext
Скопировать код
Итог: 🖼️

Использование SimpleDateFormat при необходимости

В определённых случаях всё же может потребоваться SimpleDateFormat, но имейте в виду его особенности и ограниченную эффективность.

Java
Скопировать код
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
java.util.Date dateWithoutTime = sdf.parse("25/12/2023");

Ясность кода

Ваши намерения должны быть ясны: если вам нужна дата без времени, используйте LocalDate. Это упрощает чтение кода и снижает вероятность ошибок.

Расширенные возможности java.time

Если вам не хватает функционала базовых классов java.time, проект ThreeTen-Extra предоставляет дополнительные инструменты для расширения капабилитиз этого фреймворка.

Полезные материалы

  1. LocalDate (Java Platform SE 8) — официальная документация.
  2. SimpleDateFormat (Java Platform SE 7) — информация об форматировании даты.
  3. Joda-Time – Home — руководство по Joda-Time.
  4. Date Classes (The Java™ Tutorials > Date Time > Standard Calendar) — руководство по API даты и времени Java 8.
  5. DZone — переход с Joda-Time на java.time.