Probably, this question is asked many times but I might not find the correct keywords to find them.
There was a time change at 30.10. The time was set back to 2 o'clock at 03:00 o'clock (Europe/Berlin). That means, at that day, there were two 02:00 o'clock (before and after time change)
Currently, I have two date (java.util.Date) objects. One of them was created at the first 02:00 o'clock (before the time was set back) and the second one was created at the second 02:00 o'clock.
Is there any way to differentiate these objects based on whether it was created at the first or second 02:00 o'clock?
java.util.Date objects actually are in UTC but their
toString method confusingly applies a time zone when generating the string output.
You can differentiate two
Date objects by interrogating for their count from epoch. Internally the date-time is tracked as a number of milliseconds since first moment of 1970 in UTC. Call the badly-named method
java.util.Date::getTime to get a
Record moments in UTC. Every programmer should learn to think in UTC, work in UTC, do logging in UTC, and keep a second clock on their desk and screen set to UTC.
UTC is the One True Time. All others are mere variations, every time zone being a deviation from UTC.
Let me repeat the acronym one more time to be clear: UTC
Instant class is your new best friend in this arena, your go-to class for date-time work. It represents a moment on the timeline in UTC with a resolution of nanoseconds.
Instant instant = Instant.now() ;
You need not worry about Daylight Saving Time (DST) cut-overs, politicians redefining DST ( often with little notice), nor other anomalies particular to any one time zone. Just use UTC.
To generate a String representing this moment, call
toString for a string in standard ISO 8601 format. This string is always in UTC, so you don't have the problem of
Date::toString applying a time zone while generating the string. The standard format has a
Z on the end, short for
Zulu, and means UTC.
java.util.Date objects to
Instant. New conversion methods have been added to the old classes.
Instant instant = myUtilDate.toInstant();
I do not care about Berlin time. You, as a programmer, do not care about Berlin time. Your network and server admins do not care about Berlin time. We care about UTC.
The only people who care about Berlin time are end-users. For them, you can assign a time zone for presentation of data.
ZoneId z = ZoneId.of( "Europe/Berlin" ); ZonedDateTime zdt = instant.atZone( z );
toString to generate a String in standard ISO 8601 format but wisely extended by appending the name of the time zone in square brackets.
DateTimeFormatter class to generate Strings representing the date-time value in other formats.
You can interrogate to determine if Daylight Saving Time (DST) is in effect for any particular
ZonedDateTime. See this Question.
ZoneRules rules = zdt.getZone().getRules(); Boolean dstInEffect = rules.isDaylightSavings( zdt.toInstant() );