package net.time4j.tz; import net.time4j.CalendarUnit; import net.time4j.Moment; import net.time4j.Month; import net.time4j.PlainDate; import net.time4j.PlainTime; import net.time4j.PlainTimestamp; import java.util.concurrent.TimeUnit; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import static net.time4j.tz.OffsetSign.AHEAD_OF_UTC; import static net.time4j.tz.OffsetSign.BEHIND_UTC; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(JUnit4.class) public class DatelineBorderTest { @Test public void plusCalendarDaysSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); assertThat( end, is( PlainDate.of(2011, Month.DECEMBER, 31) .at(PlainTime.midnightAtStartOfDay()) .inTimezone(ZonalOffset.ofHours(AHEAD_OF_UTC, 14)))); } @Test public void plusPosixDaysSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment end = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz) .plus(1, TimeUnit.DAYS); assertThat( end, is( PlainDate.of(2011, Month.DECEMBER, 31) .at(PlainTime.midnightAtStartOfDay()) .inTimezone(ZonalOffset.ofHours(AHEAD_OF_UTC, 14)))); } @Test public void plusPosixHoursSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment end = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz) .plus(24, TimeUnit.HOURS); assertThat( end, is( PlainDate.of(2011, Month.DECEMBER, 31) .at(PlainTime.midnightAtStartOfDay()) .inTimezone(ZonalOffset.ofHours(AHEAD_OF_UTC, 14)))); } @Test public void standardOffsetChangeSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment start = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); assertThat( tz.getOffset(start), is(ZonalOffset.ofHours(BEHIND_UTC, 10))); assertThat( tz.getOffset(end), is(ZonalOffset.ofHours(AHEAD_OF_UTC, 14))); } @Test public void daysShiftSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment start = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); // crossing international dateline border assertThat(start.until(end, TimeUnit.DAYS), is(1L)); } @Test public void hoursShiftSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment start = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); // crossing international dateline border assertThat(start.until(end, TimeUnit.HOURS), is(24L)); } @Test public void minutesShiftSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment start = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); // crossing international dateline border assertThat(start.until(end, TimeUnit.MINUTES), is(1440L)); } @Test public void secondsShiftSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment start = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); // crossing international dateline border assertThat(start.until(end, TimeUnit.SECONDS), is(86400L)); } @Test public void invalidDaySamoa() { TZID timezone = Timezone.of("Pacific/Apia").getID(); assertThat( PlainDate.of(2011, Month.DECEMBER, 30).atTime(12, 0) .isValid(timezone), is(false)); } @Test public void dayBeforeShiftSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment start = PlainDate.of(2011, Month.DECEMBER, 29).atStartOfDay().in(tz); assertThat( start.toZonalTimestamp(tz.getID()), is(PlainTimestamp.of(2011, 12, 29, 0, 0))); } @Test public void dayAfterShiftSamoa() { Timezone tz = Timezone.of("Pacific/Apia"); Moment end = PlainDate.of(2011, Month.DECEMBER, 29) .atStartOfDay().plus(2, CalendarUnit.DAYS).in(tz); assertThat( end.toZonalTimestamp(tz.getID()), is(PlainTimestamp.of(2011, 12, 31, 0, 0))); } }