Информация о дате отключения Java - PullRequest
104 голосов
/ 15 декабря 2009

У меня есть объект Java Date, содержащий информацию о дате и времени. Я хочу написать метод, который отсекает информацию о времени, усекает часы-минуты-секунды, поэтому у меня остается только дата.

Пример ввода:

2008-01-01 13:15:00

Ожидаемый результат:

2008-01-01 00:00:00

У вас есть совет? Я пытался сделать что-то вроде этого:

(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)

но у меня возникли проблемы с часовым поясом.

Ответы [ 21 ]

165 голосов
/ 15 декабря 2009

Рекомендованный способ манипулирования датой / временем - использовать объект Calendar:

Calendar cal = Calendar.getInstance(); // locale-specific
cal.setTime(dateObject);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
long time = cal.getTimeInMillis();
132 голосов
/ 15 декабря 2009

Вы смотрели на метод усечения DateUtils в Apache Commons Lang?

Date truncatedDate = DateUtils.truncate(new Date(), Calendar.DATE);

удалит элемент времени.

41 голосов
/ 15 декабря 2009

Вы смотрели на Джода ? Это намного более простой и интуитивно понятный способ работы с датами и временем. Например, вы можете тривиально конвертировать между (скажем) LocalDateTime и LocalDate объектами.

например. (для иллюстрации API)

LocalDate date = new LocalDateTime(milliseconds).toLocalDate()

Кроме того, он решает некоторые проблемы безопасности потоков с форматерами даты и времени и настоятельно рекомендуется для работы с любыми проблемами даты / времени в Java.

26 голосов
/ 05 марта 2015

Просто быстрое обновление в свете классов java.time , встроенных в Java 8 и новее.

LocalDateTime имеет метод truncatedTo, который эффективно учитывает то, о чем вы здесь говорите:

LocalDateTime.now().truncatedTo(ChronoUnit.MINUTES)

Показывает текущее время только в минутах:

2015-03-05T11:47

Вы можете использовать любой ChronoUnit (или даже любой TemporalUnit) для выполнения усечения.

24 голосов
/ 15 декабря 2009
Date date = new Date();
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();
21 голосов
/ 12 июня 2013

С Joda вы можете легко получить ожидаемую дату.

Начиная с версии 2.7 (возможно, начиная с какой-то предыдущей версии, большей, чем 2.2), как отмечает комментатор, toDateMidnight устарел в пользу или метко назван withTimeAtStartOfDay(), что делает удобным

DateTime.now().withTimeAtStartOfDay()

возможно.

Добавлена ​​выгода от более приятного API.

С более старыми версиями вы можете сделать

new DateTime(new Date()).toDateMidnight().toDate()
7 голосов
/ 10 мая 2013

Для отметок времени:

timestamp -= timestamp % (24 * 60 * 60 * 1000)
6 голосов
/ 02 августа 2012

Используйте DateUtils из Apache с усечением, например:

DateUtils.truncate(Calendar.getInstance().getTime(), Calendar.DATE);
6 голосов
/ 29 сентября 2014

Я сделал усечение с новым API java8. Я столкнулся с одной странной вещью, но в целом это усеченная ...

Instant instant = date.toInstant();
instant = instant.truncatedTo(ChronoUnit.DAYS);
date = Date.from(instant);
5 голосов
/ 26 апреля 2012

Из java.util. Дата JavaDocs:

Класс Date представляет определенный момент времени с точностью до миллисекунды

и из JavaDocs java.sql.Date:

Чтобы соответствовать определению SQL DATE, значения миллисекунд, обернутые экземпляром java.sql.Date, должны быть «нормализованы» путем установки часов, минут, секунд и миллисекунд на ноль в конкретном часовом поясе, с которым Экземпляр связан.

Итак, лучший подход - использовать java.sql.Date, если вам не нужна часть времени

java.util.Date utilDate = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(System.currentTimeMillis());

и вывод:

java.util.Date : Thu Apr 26 16:22:53 PST 2012
java.sql.Date  : 2012-04-26
...