Ad Infinitum
Ad Infinitum

Reputation: 3696

Determining the hour in daylight saving time

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?

Upvotes: 1

Views: 2531

Answers (1)

Basil Bourque
Basil Bourque

Reputation: 338775

Count from epoch

Your 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 long.

UTC

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

The 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.

instant.toString():
2016-01-23T12:34:56.123456789Z

Converting Date

Convert your java.util.Date objects to Instant. New conversion methods have been added to the old classes.

Instant instant = myUtilDate.toInstant();

Zoned

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 );

Call toString to generate a String in standard ISO 8601 format but wisely extended by appending the name of the time zone in square brackets.

2016-07-07T08:00:15.768+02:00[Europe/Berlin]

Use DateTimeFormatter class to generate Strings representing the date-time value in other formats.

DST in effect?

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() );

Upvotes: 5

Related Questions