Java8 DateTimeFormatter am / pm

时间:2016-07-07 16:09:30

标签: java java-8 java-time

我正在尝试解析一些日期,但DateTimeParser似乎不同意我的有效日期

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))

当我尝试这个时,它说

java.time.format.DateTimeParseException: Text 'Wed Jul 16, 2016 4:38pm EDT' could not be parsed at index 17

小时有问题吗?当我放弃其中一个' h'它进一步发展(尽管它应该只用0 - 我的时间),但它不喜欢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

我不知道他的确切问题是什么。当我尝试“hh:mmaa'作为一种模式,它表示它不喜欢两个,现在我被卡住了,因为错误消息没有帮助。

3 个答案:

答案 0 :(得分:15)

a要求PMAM为大写。要获得不区分大小写的格式化程序,您需要手动构建它:

DateTimeFormatter fmt = new DateTimeFormatterBuilder()
        .parseCaseInsensitive()
        .appendPattern("EEE MMM dd, yyyy h:mma z")
        .toFormatter(Locale.US);

请注意,您将收到新错误,因为7月16日不是星期三。

答案 1 :(得分:2)

请注意,AMPM 的大小写取决于您的语言环境!

因此,如果您的语言环境是美国,则应为大写,但如果是英国,则应为小写。

请参阅:Localize the period (AM/PM) in a time stamp to another language 了解更多详情。

答案 2 :(得分:0)

事实证明,此解决方案还解决了尝试使用" MMM"解析混合案例月份(例如" Jul")。