Reputation: 24659
I am trying to parse a date string using the following pattern: yyMMdd
and the STRICT
resolver as follows:
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(dateFormat).withResolverStyle(ResolverStyle.STRICT);
LocalDate.parse(expiryDate, formatter);
I get the following DateTimeParseException
:
java.time.format.DateTimeParseException: Text '160501' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {YearOfEra=2016, MonthOfYear=5, DayOfMonth=1},ISO of type java.time.format.Parsed
When I switch to the default resolve style, i.e. ResolverStyle.SMART
it allows such dates as 30th of February.
Can someone please help?
Upvotes: 10
Views: 5681
Reputation: 86139
While JodaStephen has nicely explained the reason for the exception and given one good solution (use uu
rather than yy
), I am offering a couple of other possible solutions:
SMART
(the default). In other words either leave out .withResolverStyle(ResolverStyle.STRICT)
completely or change it to .withResolverStyle(ResolverStyle.SMART)
.For the second option here is a code example:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyMMdd")
.parseDefaulting(ChronoField.ERA, 1)
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT);
String expiryDate = "160501";
LocalDate result = LocalDate.parse(expiryDate, formatter);
System.out.println(result);
Output is:
2016-05-01
Where the last solution may make a difference compared to using uu
in the format pattern:
u
or y
is used.y
it will fail with an exception if the string contains a negative year. Depending on your situation and requirements this may be desirable or unacceptable.Edit: The second argument to parseDefaulting()
may also be written IsoEra.CE.getValue()
rather than just 1
to make it clear that we are specifying the current era (CE; also often called Anno Domini or AD).
Upvotes: 5
Reputation: 63355
The strict resolver requires an era to go with YearOfEra. Change your pattern to use "u" instead of "y" and it will work, ie. "uuMMdd".
Upvotes: 19