Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does Java 8's ZonedDateTime take into account daylight savings when converting?

I have the following code below:

ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(
            this.start.toLocalDateTime(), ZoneOffset.UTC,
            ZoneOffset.systemDefault());

The this.start is from a java.sql.Timestamp. I am explicitly converting from UTC here to the system's local offset, will this be smarty enough to take into account daylight savings?

like image 476
Darren Avatar asked Oct 21 '25 12:10

Darren


2 Answers

ZonedDateTime takes daylight savings into account. That's what differs it from LocalDateTime. Well, that and timezone information.

like image 55
Avneet Paul Avatar answered Oct 23 '25 00:10

Avneet Paul


The accepted answer lacks an example. It also compares a ZonedDateTime with a LocalDateTime in the context of DST which does not make sense as a LocalDateTime lacks a time zone. In the context of DST, the comparison should be between a ZonedDateTime and an OffsetDateTime. While a ZonedDateTime, automatically changes the zone offset for a ZoneId according to the DST, an OffsetDateTime is used with a fixed zone offset.

Demo

public class Main {
    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.of("America/New_York");

        // A sample ZonedDateTime during DST
        ZonedDateTime zdtDuringDST = ZonedDateTime.of(
                LocalDate.of(2024, 5, 20),
                LocalTime.MIN,
                zoneId
        );

        // A sample ZonedDateTime outside DST
        ZonedDateTime zdtOutsideDST = ZonedDateTime.of(
                LocalDate.of(2024, 12, 20),
                LocalTime.MIN,
                zoneId
        );

        System.out.println(zdtDuringDST);
        System.out.println(zdtOutsideDST);
    }
}

Output:

2024-05-20T00:00-04:00[America/New_York]
2024-12-20T00:00-05:00[America/New_York]

Online Demo

As you can see in the results, the ZonedDateTime automatically set the applicable offsets, -04:00 and -05:00 based on the DST. On the other hand, you use an OffsetDateTime with a fixed zone offset e.g. the zone offset, +01:00 in the below OffsetDateTime will remain fixed irrespective of change in date and time:

ZoneOffset zoneOffset = ZoneOffset.ofHoursMinutes(1, 0);

OffsetDateTime.of(
        LocalDate.of(2024, 5, 20),
        LocalTime.MIN,
        zoneOffset
);

Learn more about the modern Date-Time API from Trail: Date Time.

like image 27
Arvind Kumar Avinash Avatar answered Oct 23 '25 00:10

Arvind Kumar Avinash



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!