user2329125
user2329125

Reputation:

Java8 DateTimeFormatter am/pm

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

Answers (3)

Matthew
Matthew

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

user3897528
user3897528

Reputation:

It turns out this solution also resolves trying to parse mixed-case months (e.g., "Jul") using "MMM".

Upvotes: 0

assylias
assylias

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

Related Questions