Timezone is a complex issue in Programmer’s world. Coupled with Java’s legacy datetime API it could be a nightmare. Below list some of the practices I followed when dealing with Timezone / DST (Daylight Saving Time).

1. Expect DST rules to change

DST rules changes upon each countries / cities political decision (sometimes for no reason). It changes very often and may have very short notice period.

2. Use TZDB ZoneId

A TZDB Timezone ID have format {area}/{city}, e.g. "Europe/Rome". TZDB ID is preferred over Three-Letter Timezone (e.g. CST), because it is less ambiguous and it takes DST into account.

Sample code for retrieving local Datetime with DST on Java 8

Instant instant = ts.toInstant();
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

3. Update tzdata regularly

ZonedDateTime calculate the DST depends on the tzdata stored in local JRE. Be sure to update tzdata regularly to incorporate incoming DST changes.