Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the end of day as a OffsetDateTime in the format 2019-12-29 05:59:59.9999990 +00:00?

Tags:

java

date

Supposing the time zone is CST. I have a webservice that returns a java.util.Date as "2020-03-14". I want to convert it to OffsetDateTime in the format "2020-03-14 05:59:59.9999990 +00:00". The below code does not have the time information.

Date endDate = someService.getEndDate();
Instant instant = Instant.ofEpochMilli(endDate.getTime());
OffsetDateTime offsetEndDt = OffsetDateTime.ofInstant(instant, ZoneOffset.UTC);

The value of offsetEndDt is 2020-03-14T05:00Z

like image 883
Andulos Avatar asked Sep 07 '25 00:09

Andulos


1 Answers

First allow me to suggest that you represent the end of your interval NOT as one microsecond before the next day begins, but AS the first moment of the next day exclusive. So a point in time is inside your interval if it is strictly before your end time. This is philosophically more correct. And it rules out the possibility of falsely excluding a point in time within the last 999 nanoseconds of the day from your interval.

    // Construct an example java.util.Date for the demonstration
    Instant exampleInstant = LocalDate.of(2020, Month.MARCH, 14)
            .atStartOfDay(ZoneId.systemDefault())
            .toInstant();
    Date enddt = Date.from(exampleInstant);

    System.out.println("Example java.util.Date: " + enddt);

    OffsetDateTime edt = enddt.toInstant()
            .atZone(ZoneId.systemDefault())
            .plusDays(1)
            .truncatedTo(ChronoUnit.DAYS)
            .toOffsetDateTime();

    System.out.println("End: " + edt);

As one interpretation of EST (of several possible) I have run this code in America/Atikokan time zone (America/Winnipeg gave me EDT). The output was:

Example java.util.Date: Sat Mar 14 00:00:00 EST 2020
End: 2020-03-15T00:00-05:00

If you insist on getting the time 1 microsecond before the new day starts, subtract a microsecond:

    OffsetDateTime edt = enddt.toInstant()
            .atZone(ZoneId.systemDefault())
            .plusDays(1)
            .truncatedTo(ChronoUnit.DAYS)
            .minus(1, ChronoUnit.MICROS)
            .toOffsetDateTime();
End: 2020-03-14T23:59:59.999999-05:00
like image 112
Ole V.V. Avatar answered Sep 10 '25 13:09

Ole V.V.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!