Java OffsetDateTime格式和解析

Java OffsetDateTime格式和解析,java,datetimeformatter,offsetdatetime,Java,Datetimeformatter,Offsetdatetime,此代码 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”可能 无法分析:无法从TemporalAcce

此代码

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


这不应该吗?

顾名思义,
OffsetDateTime
也需要时间组件(小时、分钟等)
DateTimeFormatter.ISO\u OFFSET\u 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.-谢谢你的建议。我已经更新了答案,将其纳入其中。