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 swith to the default resolve style, i.e. ResolverStyle.SMART
it allows such dates as 30th of February.
Can someone please help?
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".
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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With