【问题标题】:DateTimeFormatterBuilder with default zone id? [duplicate]具有默认区域 ID 的 DateTimeFormatterBuilder? [复制]
【发布时间】:2020-07-07 15:45:10
【问题描述】:

我有一个要求,如果 ISO 日期时间未指定区域偏移量,我应该假设欧洲/布拉迪斯拉发的当前偏移量。

基本上"2020-03-26T22:47:32.497" -> "2020-03-26T22:47:32.497+01:00"

Tldr;如果有,则解析时区 id,但如果没有,则默认为特定的

我现在拥有的

private val isoDateTimeParser = DateTimeFormatterBuilder()
    .append(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
    .parseDefaulting(ChronoField...?)
    .toFormatter()

显然它不起作用。甚至可能吗?我应该只有 2 个格式化程序(一个带 tz,一个不带)然后一个接一个地尝试吗?

【问题讨论】:

    标签: java java-time date-parsing jsr310


    【解决方案1】:

    使用withZone向格式化程序添加“覆盖区域”

    private val isoDateTimeParser = DateTimeFormatterBuilder()
        .append(DateTimeFormatter.ISO_DATE_TIME)
        .toFormatter()
        .withZone(/*whatever*/)
    

    来自文档

    如果一个区域是直接从文本中解析出来的,可能是因为 DateTimeFormatterBuilder.appendZoneId() 被使用,然后这个覆盖 区域无效


    顺便说一句,格式化程序很少有任何理由成为实例变量。它应该是静态的。鉴于它是不可变的,因此是一个常量,它也应该是大写的。

    private static final ISO_DATE_TIME_PARSER = ...
    

    【讨论】:

    • 不起作用。 org.threeten.bp.format.DateTimeParseException: Text '2020-03-26T22:47:32.497' could not be parsed at index 23
    • @urSus ISO_OFFSET_DATE_TIME 没有可选的偏移量,它是强制性的。
    • 这就是我的全部问题,如何将默认值附加到可选时区
    • @urSus 见编辑朋友
    猜你喜欢
    • 2011-02-08
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多