|
| 1 | +package com.baeldung.dst; |
| 2 | + |
| 3 | +import static org.assertj.core.api.Assertions.assertThat; |
| 4 | + |
| 5 | +import java.text.DateFormat; |
| 6 | +import java.text.ParseException; |
| 7 | +import java.text.SimpleDateFormat; |
| 8 | +import java.util.Calendar; |
| 9 | +import java.util.Date; |
| 10 | +import java.util.Locale; |
| 11 | +import java.util.TimeZone; |
| 12 | + |
| 13 | +import org.junit.Test; |
| 14 | + |
| 15 | +public class DaylightSavingTimeExamplesTest { |
| 16 | + |
| 17 | + @Test |
| 18 | + public void givenItalianTimeZone_WhenDSTHappens_ThenCorrectlyShiftTimeZone() throws ParseException { |
| 19 | + TimeZone tz = TimeZone.getTimeZone("Europe/Rome"); |
| 20 | + Calendar cal = Calendar.getInstance(tz, Locale.ITALIAN); |
| 21 | + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ITALIAN); |
| 22 | + Date dateBeforeDST = df.parse("2018-03-25 01:55"); |
| 23 | + prettyPrint(cal.getTimeZone()); |
| 24 | + |
| 25 | + cal.setTime(dateBeforeDST); |
| 26 | + System.out.println("Before DST (00:55 UTC - 01:55 GMT+1) = " + dateBeforeDST); |
| 27 | + System.out.println("With this Calendar " + (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / (60 * 1000) + " minutes must be added to UTC (GMT TimeZone) to get a correct date for this TimeZone\n"); |
| 28 | + assertThat(cal.get(Calendar.ZONE_OFFSET)).isEqualTo(3600000); |
| 29 | + assertThat(cal.get(Calendar.DST_OFFSET)).isEqualTo(0); |
| 30 | + |
| 31 | + cal.add(Calendar.MINUTE, 10); |
| 32 | + |
| 33 | + Date dateAfterDST = cal.getTime(); |
| 34 | + System.out.println(" After DST (01:05 UTC - 03:05 GMT+2) = " + dateAfterDST); |
| 35 | + System.out.println("With this Calendar " + (cal.get(Calendar.ZONE_OFFSET) + cal.get(Calendar.DST_OFFSET)) / (60 * 1000) + " minutes must be added to UTC (GMT TimeZone) to get a correct date for this TimeZone\n"); |
| 36 | + assertThat(cal.get(Calendar.DST_OFFSET)).isEqualTo(3600000); |
| 37 | + assertThat(dateAfterDST).isEqualTo(df.parse("2018-03-25 03:05")); |
| 38 | + |
| 39 | + Long deltaBetweenDatesInMillis = dateAfterDST.getTime() - dateBeforeDST.getTime(); |
| 40 | + Long tenMinutesInMillis = (1000L * 60 * 10); |
| 41 | + assertThat(deltaBetweenDatesInMillis).isEqualTo(tenMinutesInMillis); |
| 42 | + } |
| 43 | + |
| 44 | + private void prettyPrint(TimeZone tz) { |
| 45 | + System.out.println(String.format( |
| 46 | + " Zone ID = %s (%s)\n" |
| 47 | + + " RawOffset = %s minutes\n" |
| 48 | + + " DST = %s minutes\n" |
| 49 | + + " -----------------------------------------", |
| 50 | + tz.getID(), tz.getDisplayName(), tz.getRawOffset()/60000, tz.getDSTSavings()/60000)); |
| 51 | + } |
| 52 | + |
| 53 | + @Test |
| 54 | + public void whenIterating_ThenPrintAllTimeZones() { |
| 55 | + for (String id : TimeZone.getAvailableIDs()) { |
| 56 | + TimeZone tz = TimeZone.getTimeZone(id); |
| 57 | + prettyPrint(tz); |
| 58 | + } |
| 59 | + } |
| 60 | +} |
0 commit comments