Skip to content

Commit 86e8493

Browse files
authored
Merge pull request eugenp#3872 from andrea-ligios/master
BAEL-1599
2 parents 2840347 + b07e50f commit 86e8493

2 files changed

Lines changed: 112 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.baeldung.dst;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import java.text.ParseException;
6+
import java.time.LocalDateTime;
7+
import java.time.ZoneId;
8+
import java.time.ZonedDateTime;
9+
import java.time.temporal.ChronoUnit;
10+
import java.util.TimeZone;
11+
12+
import org.junit.Test;
13+
14+
public class DaylightSavingTimeJavaTimeExamplesTest {
15+
16+
@Test
17+
public void givenItalianTimeZone_WhenDSTHappens_ThenCorrectlyShiftTimeZone() throws ParseException {
18+
ZoneId italianZoneId = ZoneId.of("Europe/Rome");
19+
20+
LocalDateTime localDateTimeBeforeDST = LocalDateTime.of(2018, 3, 25, 1, 55);
21+
System.out.println(localDateTimeBeforeDST);
22+
assertThat(localDateTimeBeforeDST.toString()).isEqualTo("2018-03-25T01:55");
23+
24+
ZonedDateTime zonedDateTimeBeforeDST = localDateTimeBeforeDST.atZone(italianZoneId);
25+
prettyPrint(zonedDateTimeBeforeDST);
26+
assertThat(zonedDateTimeBeforeDST.toString()).isEqualTo("2018-03-25T01:55+01:00[Europe/Rome]");
27+
28+
ZonedDateTime zonedDateTimeAfterDST = zonedDateTimeBeforeDST.plus(10, ChronoUnit.MINUTES);
29+
prettyPrint(zonedDateTimeAfterDST);
30+
assertThat(zonedDateTimeAfterDST.toString()).isEqualTo("2018-03-25T03:05+02:00[Europe/Rome]");
31+
32+
Long deltaBetweenDatesInMinutes = ChronoUnit.MINUTES.between(zonedDateTimeBeforeDST,zonedDateTimeAfterDST);
33+
assertThat(deltaBetweenDatesInMinutes).isEqualTo(10);
34+
35+
}
36+
37+
private void prettyPrint(ZonedDateTime zdt) {
38+
System.out.println(String.format(
39+
" ZonedDateTime = %s\n"
40+
+ " Zone ID = %s (%s)\n"
41+
+ " RawOffset = %s minutes\n"
42+
+ " -----------------------------------------",
43+
zdt, zdt.getZone(), zdt.getZone().getId(), zdt.getOffset().getTotalSeconds()/60));
44+
}
45+
46+
@Test
47+
public void whenCounting_ThenPrintDifferencesBetweenAPIs() {
48+
System.out.println("Total java.time.ZoneId count : " + ZoneId.getAvailableZoneIds().size());
49+
System.out.println("Total java.util.TimeZone Id count : " + TimeZone.getAvailableIDs().length);
50+
}
51+
52+
}

0 commit comments

Comments
 (0)