Java.time: Is CET time zone summertime?

I am using the new java.time implementation of Java 8, which is of interest for outputting UTC to CET , the result of a time conversion.

 ZonedDateTime utcTime = ZonedDateTime.of(2014, 7, 1, 8, 0, 0, 0, ZoneId.of("UTC")); ZonedDateTime cetTime = ZonedDateTime.ofInstant(utcTime.toInstant(), ZoneId.of("CET")); System.out.println("Summer-UTC-Time: " + utcTime); System.out.println("Summer-CET-Time: " + cetTime); System.out.println(); utcTime = ZonedDateTime.of(2014, 1, 1, 8, 0, 0, 0, ZoneId.of("UTC")); cetTime = ZonedDateTime.ofInstant(utcTime.toInstant(), ZoneId.of("CET")); System.out.println("Winter-UTC-Time: " + utcTime); System.out.println("Winter-CET-Time: " + cetTime); 

I expected CET time to always be +1 from UTC, but instead I got:

 Summer-UTC-Time: 2014-07-01T08:00Z[UTC] Summer-CET-Time: 2014-07-01T10:00+02:00[CET] -> +2 **Unexpected** Winter-UTC-Time: 2014-01-01T08:00Z[UTC] Winter-CET-Time: 2014-01-01T09:00+01:00[CET] -> +1 Expected 

Apparently, I have to deal with daylight saving time, which I did not expect when using CET. Is java.time CET CEST ? And if so, which zone should I use if I need a CET?

+6
source share
2 answers

The IANA definition of CET is that it follows the rules of the time zone in Central Europe, which include both winter and summer time. These rules can be seen here which shows that the "CET" is based on the "C-Eur" , which includes daylight saving time.

In java.time you can also see the full set of rules:

 ZoneId zone = ZoneId.of("CET"); System.out.println(zone); System.out.println(zone.getRules()); for (ZoneOffsetTransition trans : zone.getRules().getTransitions()) { System.out.println(trans); } for (ZoneOffsetTransitionRule rule : zone.getRules().getTransitionRules()) { System.out.println(rule); } 

which prints:

 CET ZoneRules[currentStandardOffset=+01:00] Transition[Gap at 1916-04-30T23:00+01:00 to +02:00] Transition[Overlap at 1916-10-01T01:00+02:00 to +01:00] Transition[Gap at 1917-04-16T02:00+01:00 to +02:00] Transition[Overlap at 1917-09-17T03:00+02:00 to +01:00] Transition[Gap at 1918-04-15T02:00+01:00 to +02:00] Transition[Overlap at 1918-09-16T03:00+02:00 to +01:00] Transition[Gap at 1940-04-01T02:00+01:00 to +02:00] Transition[Overlap at 1942-11-02T03:00+02:00 to +01:00] Transition[Gap at 1943-03-29T02:00+01:00 to +02:00] Transition[Overlap at 1943-10-04T03:00+02:00 to +01:00] Transition[Gap at 1944-04-03T02:00+01:00 to +02:00] Transition[Overlap at 1944-10-02T03:00+02:00 to +01:00] Transition[Gap at 1945-04-02T02:00+01:00 to +02:00] Transition[Overlap at 1945-09-16T03:00+02:00 to +01:00] Transition[Gap at 1977-04-03T02:00+01:00 to +02:00] Transition[Overlap at 1977-09-25T03:00+02:00 to +01:00] Transition[Gap at 1978-04-02T02:00+01:00 to +02:00] Transition[Overlap at 1978-10-01T03:00+02:00 to +01:00] Transition[Gap at 1979-04-01T02:00+01:00 to +02:00] Transition[Overlap at 1979-09-30T03:00+02:00 to +01:00] Transition[Gap at 1980-04-06T02:00+01:00 to +02:00] Transition[Overlap at 1980-09-28T03:00+02:00 to +01:00] Transition[Gap at 1981-03-29T02:00+01:00 to +02:00] Transition[Overlap at 1981-09-27T03:00+02:00 to +01:00] Transition[Gap at 1982-03-28T02:00+01:00 to +02:00] Transition[Overlap at 1982-09-26T03:00+02:00 to +01:00] Transition[Gap at 1983-03-27T02:00+01:00 to +02:00] Transition[Overlap at 1983-09-25T03:00+02:00 to +01:00] Transition[Gap at 1984-03-25T02:00+01:00 to +02:00] Transition[Overlap at 1984-09-30T03:00+02:00 to +01:00] Transition[Gap at 1985-03-31T02:00+01:00 to +02:00] Transition[Overlap at 1985-09-29T03:00+02:00 to +01:00] Transition[Gap at 1986-03-30T02:00+01:00 to +02:00] Transition[Overlap at 1986-09-28T03:00+02:00 to +01:00] Transition[Gap at 1987-03-29T02:00+01:00 to +02:00] Transition[Overlap at 1987-09-27T03:00+02:00 to +01:00] Transition[Gap at 1988-03-27T02:00+01:00 to +02:00] Transition[Overlap at 1988-09-25T03:00+02:00 to +01:00] Transition[Gap at 1989-03-26T02:00+01:00 to +02:00] Transition[Overlap at 1989-09-24T03:00+02:00 to +01:00] Transition[Gap at 1990-03-25T02:00+01:00 to +02:00] Transition[Overlap at 1990-09-30T03:00+02:00 to +01:00] Transition[Gap at 1991-03-31T02:00+01:00 to +02:00] Transition[Overlap at 1991-09-29T03:00+02:00 to +01:00] Transition[Gap at 1992-03-29T02:00+01:00 to +02:00] Transition[Overlap at 1992-09-27T03:00+02:00 to +01:00] Transition[Gap at 1993-03-28T02:00+01:00 to +02:00] Transition[Overlap at 1993-09-26T03:00+02:00 to +01:00] Transition[Gap at 1994-03-27T02:00+01:00 to +02:00] Transition[Overlap at 1994-09-25T03:00+02:00 to +01:00] Transition[Gap at 1995-03-26T02:00+01:00 to +02:00] Transition[Overlap at 1995-09-24T03:00+02:00 to +01:00] Transition[Gap at 1996-03-31T02:00+01:00 to +02:00] Transition[Overlap at 1996-10-27T03:00+02:00 to +01:00] Transition[Gap at 1997-03-30T02:00+01:00 to +02:00] Transition[Overlap at 1997-10-26T03:00+02:00 to +01:00] TransitionRule[Gap +01:00 to +02:00, SUNDAY on or after MARCH 25 at 02:00 STANDARD, standard offset +01:00] TransitionRule[Overlap +02:00 to +01:00, SUNDAY on or after OCTOBER 25 at 02:00 STANDARD, standard offset +01:00] 

The key point here is the understanding that the time zone identifier and the "short name" of this identifier are two different elements. The identifier is always fixed as "CET", but the name changes between "CET" and "CEST".

+11
source

Since you know the offset and don't want to use DTS, why not use the ZoneOffset.ofHours(1) method instead of ZoneId.of("CET") ?

You can also call normalized() on any instance of ZoneId to make it a fixed offset, but sounds less reliable than using the offset from the beginning.

From ZoneId javadoc :

A ZoneId is used to define the rules used to convert between Instant and LocalDateTime. There are two different types of IDs:

  • Fixed Offsets - A fully authorized offset from UTC / Greenwich that uses the same offset for all local dates
  • Geographic regions - an area where a specific set of rules is applied to determine the offset from UTC / Greenwich.

Most fixed offsets are represented by ZoneOffset. Calling normalized () on any ZoneId will display a fixed offset identifier like ZoneOffset.

If you do not use fixed offsets, you use geographic regions, which means that it depends on the region if DTS is observed or not. The same thing happens with PST. You will see that he is watching DTS, although daylight saving time is called PDT. Yes, this is confusing, but that is how most tools work. Read the full ZoneId javadoc for a more detailed explanation (section Time-zone IDs ).

+1
source

Source: https://habr.com/ru/post/978082/


All Articles