package net.time4j.tz; import net.time4j.Moment; import net.time4j.PlainDate; import net.time4j.PlainTime; import net.time4j.PlainTimestamp; import net.time4j.base.GregorianDate; import net.time4j.scale.TimeScale; import java.io.IOException; import java.util.List; import java.util.Locale; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class PlatformTimezoneTest { private static final String PREFIX = "java.util.TimeZone~"; @Test public void getOffsetOfUnixTimeSTD() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment utc = Moment.of(40 * 365 * 86400, TimeScale.POSIX); assertThat(tz.getOffset(utc).canonical(), is("UTC+01:00")); } @Test public void getOffsetOfUnixTimeDST() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment utc = Moment.of((40 * 365 + 180) * 86400, TimeScale.POSIX); assertThat(tz.getOffset(utc).canonical(), is("UTC+02:00")); } @Test public void getPartialOffsetsOfUnixTimeWinter() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment utc = Moment.of(40 * 365 * 86400, TimeScale.POSIX); assertThat(tz.getStandardOffset(utc).canonical(), is("UTC+01:00")); assertThat(tz.getDaylightSavingOffset(utc).canonical(), is("Z")); } @Test public void getPartialOffsetsOfUnixTimeSummer() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment utc = Moment.of((40 * 365 + 180) * 86400, TimeScale.POSIX); assertThat(tz.getStandardOffset(utc).canonical(), is("UTC+01:00")); assertThat(tz.getDaylightSavingOffset(utc).canonical(), is("UTC+01:00")); } @Test public void isDaylightSavingSTD() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment utc = Moment.of(40 * 365 * 86400, TimeScale.POSIX); assertThat(tz.isDaylightSaving(utc), is(false)); } @Test public void isDaylightSavingDST() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment utc = Moment.of((40 * 365 + 180) * 86400, TimeScale.POSIX); assertThat(tz.isDaylightSaving(utc), is(true)); } @Test public void customProviderID() { Timezone tz = Timezone.of("java.util.TimeZone~Europe/Berlin"); assertThat( tz, is(loadFromPlatform("Europe/Berlin"))); } @Test public void getOffsetOfLocalDateTimeWithWinterDST() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); ZonalOffset offset = tz.getOffset(date, PlainTime.midnightAtStartOfDay()); assertThat( offset.canonical(), is("UTC+01:00")); } @Test public void getOffsetOfLocalDateTimeWithSummerDST() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); ZonalOffset offset = tz.getOffset(date, PlainTime.of(3)); assertThat( offset.canonical(), is("UTC+02:00")); } @Test public void getOffsetOfLocalDateWithTimeInGap() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); ZonalOffset offset = tz.getOffset(date, PlainTime.of(2, 30)); assertThat( offset.canonical(), is("UTC+02:00")); } @Test public void getOffsetOfLocalDateWithTimeInOverlap() { GregorianDate date = PlainDate.of(2014, 10, 26); Timezone tz = loadFromPlatform("Europe/Berlin"); ZonalOffset offset = tz.getOffset(date, PlainTime.of(2, 30)); assertThat( offset.canonical(), is("UTC+01:00")); } @Test public void getOffsetOfLocalDateWithTimeT24() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); ZonalOffset offset = tz.getOffset(date, PlainTime.midnightAtEndOfDay()); assertThat( offset.canonical(), is("UTC+02:00")); } @Test public void isInvalidBeforeGap() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.isInvalid(date, PlainTime.of(1, 59)), is(false)); } @Test public void isInvalidInGap() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.isInvalid(date, PlainTime.of(2, 0)), is(true)); assertThat( tz.isInvalid(date, PlainTime.of(2, 59)), is(true)); } @Test public void isInvalidAfterGap() { GregorianDate date = PlainDate.of(2014, 3, 30); Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.isInvalid(date, PlainTime.of(3, 0)), is(false)); } @Test(expected=IllegalArgumentException.class) public void withStrictModeDirectUse() { Timezone.STRICT_MODE.resolve( PlainDate.of(2014, 3, 30), PlainTime.of(2, 30), loadFromPlatform("Europe/Berlin")); } @Test(expected=IllegalArgumentException.class) public void withStrictModeIndirectUse() { Timezone tz = loadFromPlatform("Europe/Berlin"); PlainTimestamp.of( PlainDate.of(2014, 3, 30), PlainTime.of(2, 30) ).in(tz.with(Timezone.STRICT_MODE)); } @Test public void withDefaultConflictStrategyGetOffset() { Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( Timezone.DEFAULT_CONFLICT_STRATEGY.getOffset( PlainDate.of(2014, 3, 30), PlainTime.of(2, 30), tz ), is(ZonalOffset.ofTotalSeconds(7200))); } @Test public void withDefaultConflictStrategyResolvingGermany() { Timezone tz = loadFromPlatform("Europe/Berlin"); Moment m = PlainTimestamp.of( PlainDate.of(2014, 3, 30), PlainTime.of(2, 30) ).in(tz.with(Timezone.DEFAULT_CONFLICT_STRATEGY)); assertThat( m, is(PlainTimestamp.of(2014, 3, 30, 3, 30).in(tz))); assertThat( m.toZonalTimestamp(tz.getID()), is(PlainTimestamp.of(2014, 3, 30, 3, 30))); } @Test public void withDefaultConflictStrategyResolvingBrazil() { Timezone tz = loadFromPlatform("America/Sao_Paulo"); Moment m = PlainTimestamp.of( PlainDate.of(2014, 10, 19), PlainTime.midnightAtStartOfDay() ).in(tz.with(Timezone.DEFAULT_CONFLICT_STRATEGY)); assertThat( m, is(PlainTimestamp.of(2014, 10, 19, 1, 0).in(tz))); assertThat( m.toZonalTimestamp(tz.getID()), is(PlainTimestamp.of(2014, 10, 19, 1, 0))); } @Test public void getAvailableIDs() { List<TZID> zoneIDs = Timezone.getAvailableIDs(); assertThat(zoneIDs.size() > 1, is(true)); assertThat(zoneIDs.contains(ZonalOffset.UTC), is(true)); assertThat(zoneIDs.contains(Timezone.ofSystem().getID()), is(true)); } @Test public void getDisplayName_LONG_DAYLIGHT_TIME() { Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.getDisplayName(NameStyle.LONG_DAYLIGHT_TIME, Locale.GERMAN), is("Mitteleuropäische Sommerzeit")); } @Test public void getDisplayName_SHORT_DAYLIGHT_TIME() { Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.getDisplayName(NameStyle.SHORT_DAYLIGHT_TIME, Locale.GERMAN), is("MESZ")); } @Test public void getDisplayName_LONG_STANDARD_TIME() { Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.getDisplayName(NameStyle.LONG_STANDARD_TIME, Locale.GERMAN), is("Mitteleuropäische Zeit")); } @Test public void getDisplayName_SHORT_STANDARD_TIME() { Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat( tz.getDisplayName(NameStyle.SHORT_STANDARD_TIME, Locale.GERMAN), is("MEZ")); } @Test public void getHistory() { Timezone tz = loadFromPlatform("Europe/Berlin"); assertThat(tz.getHistory(), is(nullValue())); } @Test public void getID() { TZID id = Timezone.of("Asia/Tokyo").getID(); Timezone tz = loadFromPlatform("Asia/Tokyo"); assertThat(tz.getID(), is(id)); } @Test public void ofTZID() { TZID tzid = Timezone.of(PREFIX + "Europe/Berlin").getID(); Timezone expected = loadFromPlatform("Europe/Berlin"); assertThat(Timezone.of(tzid), is(expected)); } @Test public void ofTZIDFallback() { TZID fallback = Timezone.of(PREFIX + "Europe/Berlin").getID(); Timezone expected = loadFromPlatform("Europe/Berlin"); assertThat( Timezone.of("???", fallback), is(expected)); } @Test(expected=IllegalArgumentException.class) public void ofInvalidTZIDAsString() { Timezone.of("xyz"); } @BeforeClass public static void initSystemTzOverride() { System.setProperty( "net.time4j.allow.system.tz.override", "true"); } @Test public void systemTZ() throws IOException { String zoneID = "!test-id!"; java.util.TimeZone oldTZ = java.util.TimeZone.getDefault(); java.util.TimeZone platformTZ = java.util.TimeZone.getDefault(); platformTZ.setID(zoneID); java.util.TimeZone.setDefault(platformTZ); Timezone.Cache.refresh(); assertThat(Timezone.ofSystem().getID().canonical(), is(zoneID)); assertThat(Timezone.ofSystem() instanceof PlatformTimezone, is(true)); Timezone.ofSystem().dump(System.out); java.util.TimeZone.setDefault(oldTZ); Timezone.Cache.refresh(); assertThat(Timezone.ofSystem().getID().canonical(), not(zoneID)); } private static Timezone loadFromPlatform(String tzid) { return new PlatformTimezone(Timezone.of(tzid).getID(), tzid); } }