Reputation:
I am trying to parse some dates, but the DateTimeParser seems to disagree with me on what is valid
import java.time.ZonedDateTime
import java.time.format.DateTimeFormatter
import java.util.Locale
ZonedDateTime.parse("Wed Jul 16, 2016 4:38pm EDT", DateTimeFormatter.ofPattern("EEE MMM dd, yyyy hh:mma z", Locale.US))
When I try this it says
java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 17
So something is wrong with the hours? When I drop one of the 'h' it gets further ( altough it should just 0-pad my hours ), but then it doesn't like the pm-stuff
ZonedDateTime.parse("Wed Jul 16, 2016 4:38pm EDT", DateTimeFormatter.ofPattern("EEE MMM dd, yyyy h:mma z", Locale.US))
java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 21
I don't know what his exact problem is. When I try 'hh:mmaa' as a pattern it says that it doesn't like two a and now i am stuck, since the error messages are not helpful.
Upvotes: 27
Views: 25189
Reputation: 11347
Note that the case of AM
and PM
depends on your locale!
So if your locale is US it's expected to be upper case, but if it's UK it's expected to be lower case.
See: Localize the period (AM/PM) in a time stamp to another language for more details.
Upvotes: 7
Reputation:
It turns out this solution also resolves trying to parse mixed-case months (e.g., "Jul") using "MMM".
Upvotes: 0
Reputation: 328608
a
expects either PM
or AM
in upper case. To get a case insensitive formatter you need to build it manually:
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.appendPattern("EEE MMM dd, yyyy h:mma z")
.toFormatter(Locale.US);
Note that you will get a new error because the 16th of July is not a Wednesday.
Upvotes: 33