【问题标题】:Java8 DateTimeFormatter am/pmJava8 DateTimeFormatter 上午/下午
【发布时间】:2016-11-10 01:29:01
【问题描述】:

我正在尝试解析一些日期,但 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-pad 我的小时数),但是它不喜欢 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' 作为模式时,它说它不喜欢两个 a,现在我被卡住了,因为错误消息没有帮助。

【问题讨论】:

    标签: java java-8 java-time


    【解决方案1】:

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

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

    有关详细信息,请参阅:Localize the period (AM/PM) in a time stamp to another language

    【讨论】:

      【解决方案2】:

      事实证明,该解决方案还解决了尝试使用“MMM”解析混合大小写月份(例如“Jul”)的问题。

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 哇.. 知道为什么默认不支持小写吗?我正在将旧的 java.util.Date 代码转换为 java.time 并且 SimpleDateFormat 没有问题。
        • 大小写取决于您的区域设置。请参阅下面的答案。
        猜你喜欢
        • 2012-03-28
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 2013-05-28
        • 1970-01-01
        相关资源
        最近更新 更多