I'm attempting to get today's date in nanos since Epoch at midnight (e.g. 13 Feb 2021 00:00:00).
Using GregorianCalendar/Date appears to get the right result.
The way I'm using Instant/ChronoUnit is giving me tomorrow at midnight (e.g 14 Feb 2021 00:00:00).
What is wrong here?
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.TimeZone;
class scratch {
public static void main(String[] args) {
Calendar c = new GregorianCalendar();
c.setTime(new Date());
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
c.setTimeZone(TimeZone.getTimeZone("UTC"));
long dateNanos = c.getTimeInMillis() * 1000000L;
Instant i = Instant.now().truncatedTo(ChronoUnit.DAYS);
long instantNanos = ChronoUnit.NANOS.between(Instant.EPOCH, i);
System.out.println("dateMillis = " + dateNanos);
System.out.println("instantMillis = " + instantNanos);
System.out.println("instantMillis - dateMillis = " + (instantNanos - dateNanos));
}
}
It appears that trucatedTo
is rounding up. The javadocs says it rounds down.
For example, truncating with the MINUTES unit will round down to the nearest minute, setting the seconds and nanoseconds to zero.