Search code examples
javadate

How to create a Java Date object of midnight today and midnight tomorrow?


In my code I need to find all my things that happened today. So I need to compare against dates from today at 00:00 AM (midnight early this morning) to 12:00 PM (midnight tonight).

I know ...

Date today = new Date(); 

... gets me right now. And ...

Date beginning = new Date(0);

... gets me zero time on Jan 1, 1970. But what's an easy way to get zero time today and zero time tomorrow?


UPDATE

I did this, but surely there's an easier way?

Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();
            
Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();

Solution

  • java.util.Calendar

    // today    
    Calendar date = new GregorianCalendar();
    // reset hour, minutes, seconds and millis
    date.set(Calendar.HOUR_OF_DAY, 0);
    date.set(Calendar.MINUTE, 0);
    date.set(Calendar.SECOND, 0);
    date.set(Calendar.MILLISECOND, 0);
    
    // next day
    date.add(Calendar.DAY_OF_MONTH, 1);
    

    JDK 8 - java.time.LocalTime and java.time.LocalDate

    LocalTime midnight = LocalTime.MIDNIGHT;
    LocalDate today = LocalDate.now(ZoneId.of("Europe/Berlin"));
    LocalDateTime todayMidnight = LocalDateTime.of(today, midnight);
    LocalDateTime tomorrowMidnight = todayMidnight.plusDays(1);
    

    Joda-Time

    If you're using a JDK < 8, I recommend Joda Time, because the API is really nice:

    DateTime date = new DateTime().toDateMidnight().toDateTime();
    DateTime tomorrow = date.plusDays(1);
    

    Since version 2.3 of Joda Time DateMidnight is deprecated, so use this:

    DateTime today = new DateTime().withTimeAtStartOfDay();
    DateTime tomorrow = today.plusDays(1).withTimeAtStartOfDay();
    

    Pass a time zone if you don't want the JVM’s current default time zone.

    DateTimeZone timeZone = DateTimeZone.forID("America/Montreal");
    DateTime today = new DateTime(timeZone).withTimeAtStartOfDay(); // Pass time zone to constructor.