Как я могу получить дату без времени в Java? - PullRequest
215 голосов
/ 19 февраля 2011

Продолжение вопроса о переполнении стека Java-программа для получения текущей даты без отметки времени :

Какой самый эффективный способ получения объекта Date без времени?Есть ли какой-нибудь другой способ, кроме этих двух?

// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));

// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();

Обновление :

  1. Я знал о Joda-Time ;Я просто пытаюсь избежать дополнительной библиотеки для такой простой (я думаю) задачи.Но, основываясь на ответах, пока Joda-Time кажется чрезвычайно популярным, поэтому я мог бы рассмотреть его.

  2. По по эффективности , я имею в виду, я хочу избежать временного объекта String создание, используемое method 1, в то время как method 2 похоже на взлом вместо решения.

Ответы [ 22 ]

105 голосов
/ 19 февраля 2011

У вас абсолютно есть для использования java.util.Date?Я бы тщательно рекомендовал бы вместо этого использовать Joda Time или java.time пакет из Java 8.В частности, в то время как Дата и Календарь всегда представляют определенный момент времени, без такого понятия, как «просто дата», Joda Time имеет тип, представляющий это (LocalDate).Ваш код будет намного понятнее, если вы сможете использовать типы, которые представляют то, что вы на самом деле пытаетесь сделать.

Существует множество причин использовать Joda Time или java.time вместо встроенного-в java.util типах - они, как правило, гораздо лучше API.Вы всегда можете преобразовать в / из java.util.Date на границах вашего собственного кода, если вам нужно, например, для взаимодействия с базой данных.

59 голосов
/ 15 февраля 2012

Вот то, что я использовал, чтобы получить сегодняшнюю дату со временем, установленным на 00:00:00:

DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");

Date today = new Date();

Date todayWithZeroTime = formatter.parse(formatter.format(today));
53 голосов
/ 11 октября 2013

Вы можете использовать DateUtils.truncate из библиотеки Apache Commons.

Пример:

DateUtils.truncate(new Date(), java.util.Calendar.DAY_OF_MONTH)
32 голосов
/ 22 мая 2015

Есть ли другой способ, кроме этих двух?

Да, есть.

LocalDate.now( 
    ZoneId.of( "Pacific/Auckland" ) 
)

java.time

Java 8 и более поздних версий поставляется с новым встроенным пакетом java.time .См. Учебное пособие .Большая часть функциональности java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .

По аналогии с Joda-Time , java.time предлагает класс LocalDate для представления значения только для даты без времени суток и без часового пояса.

Обратите внимание, что часовой пояс имеет решающее значение для определения конкретной даты.Например, в полночь в Париже дата все еще «вчера» в Монреале.

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

По умолчанию java.time использует стандарт ISO 8601 при создании строкового представления даты или значения даты-времени.(Еще одно сходство с Joda-Time.) Так что просто позвоните toString(), чтобы сгенерировать текст вроде 2015-05-21.

String output = today.toString() ; 

About java.time

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

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

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

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

  • Java SE 8 , Java SE 9 и более поздние
    • Встроенный-в.
    • Часть стандартного API Java с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации пакета Android для классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Бэкпорт (упоминается выше).См. Как использовать ThreeTenABP… .

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

22 голосов
/ 19 февраля 2011

Самый простой способ:

long millisInDay = 60 * 60 * 24 * 1000;
long currentTime = new Date().getTime();
long dateOnly = (currentTime / millisInDay) * millisInDay;
Date clearDate = new Date(dateOnly);
21 голосов
/ 19 февраля 2011

Стандартный ответ на эти вопросы - использовать Joda Time .API лучше, и если вы используете средства форматирования и анализаторы, вы можете избежать неинтуитивного отсутствия безопасности потоков SimpleDateFormat.

Использование Joda означает, что вы можете просто сделать:

LocalDate d = new LocalDate();

Обновление :: Используя Java 8, это можно получить с помощью

LocalDate date = LocalDate.now();
8 голосов
/ 26 августа 2014

Это простой способ сделать это:

Calendar cal = Calendar.getInstance();
SimpleDateFormat dateOnly = new SimpleDateFormat("MM/dd/yyyy");
System.out.println(dateOnly.format(cal.getTime()));
7 голосов
/ 19 февраля 2011

Не имеет смысла говорить о дате без метки времени в отношении процедур Date в стандартной среде выполнения Java, поскольку она, по сути, отображается на определенную миллисекунду, а не на дату.К указанной миллисекунде присуще время суток, что делает ее уязвимой для проблем с часовым поясом, таких как переход на летнее время и другие настройки календаря.См. Почему вычитание этих двух раз (в 1927 г.) дает странный результат? для интересного примера.

Если вы хотите работать с датами, а не с миллисекундами, вам нужно использовать что-то еще,Для Java 8 существует новый набор методов, обеспечивающих именно то, что вы просите.Для Java 7 и более ранних версий используйте http://www.joda.org/joda-time/

4 голосов
/ 26 мая 2014

Определенно не самый правильный путь, но если вам просто нужно быстрое решение, чтобы получить дату без времени, и вы не хотите использовать стороннюю библиотеку, это должно сделатьнужна была дата для визуальных целей и не мог Йода, поэтому я подстегнул.

3 голосов
/ 04 февраля 2018

Используйте LocalDate.now() и конвертируйте в Date, как показано ниже:

Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...