Получить сегодня дату на Java в полночь
Мне нужно создать два объекта даты. Если текущая дата и время 9 марта 2012 года 11:30, то
- объект даты d1 должен быть 9 марта 2012 года 12:00
- Объект даты d2 должен содержать текущую дату
Дата не будет введена, это системная дата.
Обновить:
Date dt = new Date();
System.out.print(dt.toString());
содержит текущую дату и время
Ответы
Ответ 1
Calendar c = new GregorianCalendar();
c.set(Calendar.HOUR_OF_DAY, 0); //anything 0 - 23
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
Date d1 = c.getTime(); //the midnight, that the first second of the day.
должен быть Пт Мар 09 00:00:00 IST 2012
Ответ 2
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
System.out.println(sdf.format(date));
Ответ 3
Calendar currentDate = Calendar.getInstance(); //Get the current date
SimpleDateFormat formatter= new SimpleDateFormat("yyyy/MMM/dd HH:mm:ss"); //format it as per your requirement
String dateNow = formatter.format(currentDate.getTime());
System.out.println("Now the date is :=> " + dateNow);
Ответ 4
Вот решение на основе Java 8, используя новый пакет java.time (Tutorial).
Если вы можете использовать объекты Java 8 в своем коде, используйте LocalDateTime
:
LocalDateTime now = LocalDateTime.now(); // current date and time
LocalDateTime midnight = now.toLocalDate().atStartOfDay();
Если вам нужны устаревшие даты, т.е. java.util.Date
:
Преобразуйте LocalDateTime
, который вы создали выше, в Date
с помощью этих преобразований:
LocalDateTime
→ ZonedDateTime
→ Instant
→ Date
-
Вызовите atZone(zone)
с указанной временной зоной (или ZoneId.systemDefault()
для часовой пояс системы по умолчанию), чтобы создать объект ZonedDateTime
, отредактированный для DST по мере необходимости.
ZonedDateTime zdt = midnight.atZone(ZoneId.of("America/Montreal"));
-
Вызовите toInstant()
, чтобы преобразовать ZonedDateTime
в Instant
:
Instant i = zdt.toInstant()
-
Наконец, вызовите Date.from(instant)
, чтобы преобразовать Instant
в Date
:
Date d1 = Date.from(i)
В заключение он будет выглядеть примерно так:
LocalDateTime now = LocalDateTime.now(); // current date and time
LocalDateTime midnight = now.toLocalDate().atStartOfDay();
Date d1 = Date.from(midnight.atZone(ZoneId.systemDefault()).toInstant());
Date d2 = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
См. также раздел Legacy Date-Time Code (Учебники Java ™) для взаимодействия новой функциональности java.time
с legacy java.util
.
Ответ 5
Если вы можете добавить внешние библиотеки в свой проект. Я бы порекомендовал вам попробовать Йоду-время. У него очень умный способ работы с датами.
http://joda-time.sourceforge.net/
Ответ 6
Для текущей даты и времени:
String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime());
Это будет отображаться как:
5 февраля 2013 г. 12:40:24
Ответ 7
private static Date truncateTime(Calendar cal) {
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return new Date(cal.getTime().getTime());
}
public static void main(String[] args) throws Exception{
Date d2 = new Date();
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(d2);
Date d1 = truncateTime( cal );
System.out.println(d1.toString());
System.out.println(d2.toString());
}
Ответ 8
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date(); System.out.println(dateFormat.format(date)); //2014/08/06 15:59:4
Ответ 9
Использование org.apache.commons.lang3.time.DateUtils
Date pDate = new Date();
DateUtils.truncate(pDate, Calendar.DAY_OF_MONTH);
Ответ 10
Решение в Java 8:
Date startOfToday = Date.from(ZonedDateTime.now().with(LocalTime.MIN).toInstant());
Ответ 11
Определение "Полночь
Слово "полночь" сложно определить.
Некоторые думают об этом как о моменте перед началом нового дня. Попытка представить, что в программном обеспечении так сложно, как последний момент дня, всегда можно подразделить на меньшую часть секунды.
Я предлагаю лучше подумать об этом, чтобы получить "первый момент дня".
Это поддерживает широко используемый подход определения промежутка времени как "Half-Open", где начало включено, в то время как окончание является эксклюзивным. Таким образом, полный день начинается с первого момента дня и заканчивается, но не включает, первый момент следующего дня. Полный день понравится (обратите внимание на дату, начиная с 3-го по 4-й):
2016-02-03T00: 00: 00.0-08: 00 [Америка/Los_Angeles]/2016-02-04T00:00:00.0-08:00 [Америка/Los_Angeles]
Joda времени
Если вы используете библиотеку Joda-Time, вызовите withTimeAtStartOfDay
.
Обратите внимание, как мы указываем часовой пояс. Если этот параметр опущен, неявно применяется текущий часовой пояс JVMs по умолчанию. Лучше быть явным.
DateTime todayStart = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay() ;
Если вы используете Java 8 или новее, лучше использовать пакет java.time, встроенный в Java. См. ответ от сестры от Йенса Хоффмана.