【问题标题】:DateTimeFormatter to parse all ISO-valid styles of zone-offset [duplicate]DateTimeFormatter 解析所有 ISO 有效的区域偏移样式 [重复]
【发布时间】:2019-04-23 08:56:16
【问题描述】:

使用以下格式化程序,我可以解析 "2017-03-28T23:40:06.000+0100"

new DateTimeFormatterBuilder()
            .append(ISO_LOCAL_DATE_TIME)
            .appendPattern("X")
            .toFormatter();

它解析另一个"2017-03-28T23:40:06.000+01:00"

new DateTimeFormatterBuilder()
            .append(ISO_LOCAL_DATE_TIME)
            .appendPattern("XX")
            .toFormatter();

但是,我无法指定同时解析两者的格式化程序。我应该附加什么模式?

格式化程序还应该能够处理没有区域偏移的时间戳,例如"2017-03-28T23:40:06.000Z"

【问题讨论】:

    标签: java java-time


    【解决方案1】:

    由于DateTimeFormatterBuilder 的行为类似于一个流畅的接口,最简单的方法是附加两种模式:

    new DateTimeFormatterBuilder()
            .append(ISO_LOCAL_DATE_TIME)
            .appendPattern("X")
            .appendPattern("XX")
            .toFormatter();
    

    【讨论】:

    • 这样我就无法解析另一种格式:`java.time.format.DateTimeParseException: Text '2017-03-28T23:40:06.000Z' could not be parsed, unparsed text found at index 23
    • 令人惊讶的是,Joda 似乎不能这样工作:/
    【解决方案2】:

    以下开始为我工作

    new DateTimeFormatterBuilder()
                .append(ISO_LOCAL_DATE_TIME)
                .optionalStart()
                .appendPattern("[XXX][X]")
                .toFormatter();
    

    【讨论】:

      【解决方案3】:

      我曾经有一项任务,如果字符串代表一个有效的日期,但事先不知道格式,则将任何字符串解析为日期。基本上我需要格式化任何可能格式的字符串。我想出了一个想法,您将希望支持的所有数据格式写入文件,然后逐个读取格式并尝试按该格式解析字符串,直到您成功或用完格式。这是更详细描述该想法的文章的链接:Java 8 java.time package: parsing any string to date

      【讨论】:

      • 我提前知道格式,必须是ISO-valid格式
      • 是的,我了解您事先知道格式的一些限制,但您无法创建涵盖所有可能选项的单一格式。因此,您可以应用与我建议的相同的想法。有几种格式一起涵盖所有有效选项,并尝试用这些格式一一解析您的字符串
      • 这正是我所做的,谢谢。看我的回答。
      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 2015-08-23
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 2019-04-08
      • 2018-09-08
      相关资源
      最近更新 更多