package net.time4j.format.expert; import net.time4j.Moment; import net.time4j.tz.OffsetSign; import net.time4j.tz.ZonalOffset; import java.text.ParseException; import java.util.Arrays; import java.util.Locale; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import static net.time4j.tz.OffsetSign.BEHIND_UTC; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @RunWith(Parameterized.class) public class OffsetPatternTest { @Parameterized.Parameters (name= "{index}: " + "(pattern={0},timezone={1},value={2},text={3})") public static Iterable<Object[]> data() { return Arrays.asList( new Object[][] { {"uuuuMMdd'T'HHmmssSSSSSSSSSx", ZonalOffset.UTC, "2012-06-30T23:59:60,123456789Z", "20120630T235960123456789+00"}, {"uuuuMMdd'T'HHmmssSSSSSSSSSxx", ZonalOffset.UTC, "2012-06-30T23:59:60,123456789Z", "20120630T235960123456789+0000"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSxxx", ZonalOffset.UTC, "2012-06-30T23:59:60,123456789Z", "2012-06-30T23:59:60.123456789+00:00"}, {"uuuuMMdd'T'HHmmx", ZonalOffset.ofHoursMinutes(OffsetSign.AHEAD_OF_UTC, 5, 30), "2012-06-30T12:00Z", "20120630T1730+0530"}, {"uuuuMMdd'T'HHmmxx", ZonalOffset.ofHoursMinutes(OffsetSign.AHEAD_OF_UTC, 5, 30), "2012-06-30T12:00Z", "20120630T1730+0530"}, {"uuuu-MM-dd'T'HH:mmxxx", ZonalOffset.ofHoursMinutes(OffsetSign.AHEAD_OF_UTC, 5, 30), "2012-06-30T12:00Z", "2012-06-30T17:30+05:30"}, {"uuuuMMdd'T'HHmmssSSSSSSSSSXX", ZonalOffset.UTC, "2012-06-30T23:59:60,123456789Z", "20120630T235960123456789Z"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSXXX", ZonalOffset.UTC, "2012-06-30T23:59:60,123456789Z", "2012-06-30T23:59:60.123456789Z"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSxxxxx", ZonalOffset.UTC, "2012-06-30T23:59:60,123000000Z", "2012-06-30T23:59:60.123+00:00"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSZ", ZonalOffset.UTC, "2012-06-30T23:59:60,123000000Z", "2012-06-30T23:59:60.123+0000"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSZZZZ", ZonalOffset.UTC, "2012-06-30T23:59:60,123000000Z", "2012-06-30T23:59:60.123GMT"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSZZZZZ", ZonalOffset.UTC, "2012-06-30T23:59:60,123000000Z", "2012-06-30T23:59:60.123Z"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSOOOO", ZonalOffset.UTC, "2012-06-30T23:59:60,123000000Z", "2012-06-30T23:59:60.123GMT"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSO", ZonalOffset.UTC, "2012-06-30T23:59:60,123000000Z", "2012-06-30T23:59:60.123GMT"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSXXXXX", ZonalOffset.atLongitude(BEHIND_UTC, 14, 30, 0), "2012-06-30T12:00Z", "2012-06-30T11:02:00.000000000-00:58"}, {"uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSSXXXXX", ZonalOffset.atLongitude(BEHIND_UTC, 14, 30, 20), "2012-06-30T12:00:00Z", "2012-06-30T11:01:58.000000000-00:58:02"} // rounded!!! } ); } private ChronoFormatter<Moment> formatter; private Moment value; private String text; public OffsetPatternTest( String pattern, ZonalOffset tzid, String value, String text ) throws ParseException { super(); this.formatter = ChronoFormatter.setUp(Moment.class, Locale.ROOT) .addPattern(pattern, PatternType.CLDR).build() .withTimezone(tzid); this.value = Iso8601Format.EXTENDED_DATE_TIME_OFFSET.parse(value); this.text = text; } @Test public void print() { assertThat( this.formatter.format(this.value), is(this.text)); } @Test public void parse() throws ParseException { assertThat( this.formatter.parse(this.text), is(this.value)); } }