【问题标题】:OffsetDateTime formatting and parsingOffsetDateTime 格式化和解析
【发布时间】:2021-03-10 10:48:44
【问题描述】:

这段代码

String formattedDate = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE);
OffsetDateTime.parse(formattedDate, DateTimeFormatter.ISO_OFFSET_DATE);

导致

java.time.format.DateTimeParseException: 文本 '2020-11-27+01:00' 可能 无法解析:无法从 TemporalAccessor 获取 OffsetDateTime: {OffsetSeconds=3600},ISO解析为2020-11-27类型 java.time.format.Parsed

这不应该工作吗?

【问题讨论】:

    标签: java datetimeformatter offsetdatetime


    【解决方案1】:

    顾名思义,OffsetDateTime 也需要时间组件(小时、分钟等)。 DateTimeFormatter.ISO_OFFSET_DATE 没有时间组件的模式,因此您不应使用它将日期字符串解析为 OffsetDateTime。您可以使用默认时间组件构建格式化程序。

    import java.time.OffsetDateTime;
    import java.time.format.DateTimeFormatter;
    import java.time.format.DateTimeFormatterBuilder;
    import java.time.temporal.ChronoField;
    import java.util.Locale;
    
    public class Main {
        public static void main(String[] args) {
            String formattedDate = OffsetDateTime.now().format(DateTimeFormatter.ISO_OFFSET_DATE);
            System.out.println(formattedDate);
    
            DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                    .append(DateTimeFormatter.ISO_OFFSET_DATE)
                                    .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
                                    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
                                    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                                    .toFormatter(Locale.ENGLISH);
    
            OffsetDateTime odt = OffsetDateTime.parse(formattedDate, dtf);
            System.out.println(odt);
            System.out.println(DateTimeFormatter.ISO_OFFSET_DATE.format(odt));
        }
    }
    

    输出:

    2020-11-27Z
    2020-11-27T00:00Z
    2020-11-27Z
    

    【讨论】:

    • 谢谢,@Arvind Kumar Avinash。我认为这与丢失的时间组件有关。因此,我只能将 DateTimeFormatter.ISO_OFFSET_DATE 用于格式化,而不能用于解析。对吗?
    • @Buka - 没错。事实上,在格式化方面,您可以 100% 依赖内置的格式化程序。但是,在解析日期/日期时间字符串时,可能无法直接使用某些内置格式化程序。这就是DateTimeFormatterBuilder 派上用场的地方。
    • @OleV.V. - 感谢您的建议。我已经更新了答案以将其合并。
    猜你喜欢
    • 2011-05-09
    • 2021-01-05
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2014-11-10
    • 2014-05-15
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多