OffsetTime.parse 导致 ISO_TIME 格式化程序异常

OffsetTime.parse causes an exception with ISO_TIME formatter

我正在尝试使用 ISO_TIME 格式化程序在 LocalTime 和字符串之间进行转换,但出现异常。我的代码是这样的:

        LocalTime some_time = LocalTime.of( 10, 10, 10 );
        String time_format = some_time.format(DateTimeFormatter.ISO_TIME);
        System.out.println(OffsetTime.parse(time_format, DateTimeFormatter.ISO_TIME ));

最后一行抛出异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '10:10:10' could not be parsed: Unable to obtain OffsetTime from TemporalAccessor: {},ISO resolved to 10:10:10 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
    at java.time.OffsetTime.parse(OffsetTime.java:327)

为什么会这样,我该如何解决这个问题?

在此先感谢您的帮助, 阿纳斯

之所以发生这种情况,是因为它就在名称中。 OffsetTime 包含实际时间(例如“午夜过后 5 分钟”)和时区偏移量,例如“+01.00”。 (例如,在当前比 UTC 时间晚 1 小时的某些位置,例如冬季的欧洲大陆)。

相比之下,LocalTime 仅包含实际时间,不包含偏移量。

因此无法从本地时间(无论是字符串形式还是 LocalTime 对象)转换为 OffsetTime; OffsetTime 不知道您想要哪个偏移量。

你可以做的是这样的:

LocalTime time = LocalTime.parse("10:10:10", DateTimeFormatter.ISO_TIME);
OffsetTime atPlus1 = time.atOffset(ZoneOffset.ofHours(+1));

这里从字符串中获取时间,然后以编程方式设置偏移量。

让我重复一遍:字符串10:10:10根本不是偏移时间。您可以将该字符串转换为偏移时间,也可以将苹果转换为香蕉。