diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 39da6c34e..fa0a3073f 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -9,6 +9,10 @@ + + Fix parsing of Etc/GMT+1 and similar zones which have a longer form like Etc/GMT+10. + Fixes #21. + Remove references to LocaleServiceProvider. Fixes #22. diff --git a/src/main/java/org/threeten/bp/format/DateTimeFormatterBuilder.java b/src/main/java/org/threeten/bp/format/DateTimeFormatterBuilder.java index 49515b16f..6e3dc5a38 100644 --- a/src/main/java/org/threeten/bp/format/DateTimeFormatterBuilder.java +++ b/src/main/java/org/threeten/bp/format/DateTimeFormatterBuilder.java @@ -3505,21 +3505,27 @@ public int parse(DateTimeParseContext context, CharSequence text, int position) // parse String parsedZoneId = null; + String lastZoneId = null; while (tree != null) { int nodeLength = tree.length; if (position + nodeLength > length) { break; } + lastZoneId = parsedZoneId; parsedZoneId = text.subSequence(position, position + nodeLength).toString(); tree = tree.get(parsedZoneId, context.isCaseSensitive()); } ZoneId zone = convertToZone(regionIds, parsedZoneId, context.isCaseSensitive()); if (zone == null) { - if (context.charEquals(nextChar, 'Z')) { - context.setParsed(ZoneOffset.UTC); - return position + 1; + zone = convertToZone(regionIds, lastZoneId, context.isCaseSensitive()); + if (zone == null) { + if (context.charEquals(nextChar, 'Z')) { + context.setParsed(ZoneOffset.UTC); + return position + 1; + } + return ~position; } - return ~position; + parsedZoneId = lastZoneId; } context.setParsed(zone); return position + parsedZoneId.length(); diff --git a/src/test/java/org/threeten/bp/format/TestDateTimeFormatter.java b/src/test/java/org/threeten/bp/format/TestDateTimeFormatter.java index 98eeb0677..d7b3d000f 100644 --- a/src/test/java/org/threeten/bp/format/TestDateTimeFormatter.java +++ b/src/test/java/org/threeten/bp/format/TestDateTimeFormatter.java @@ -48,6 +48,8 @@ import org.threeten.bp.LocalDate; import org.threeten.bp.LocalTime; import org.threeten.bp.YearMonth; +import org.threeten.bp.ZoneId; +import org.threeten.bp.ZonedDateTime; import org.threeten.bp.temporal.TemporalAccessor; import org.threeten.bp.temporal.TemporalQuery; @@ -485,4 +487,14 @@ public void test_toFormat_Class() throws Exception { BASIC_FORMATTER.toFormat(null); } + //------------------------------------------------------------------------- + public void test_parse_allZones() throws Exception { + for (String zoneStr : ZoneId.getAvailableZoneIds()) { + ZoneId zone = ZoneId.of(zoneStr); + ZonedDateTime base = ZonedDateTime.of(2014, 12, 31, 12, 0, 0, 0, zone); + ZonedDateTime test = ZonedDateTime.parse(base.toString()); + assertEquals(test, base); + } + } + }