gpt4 book ai didi

java - OffsetDateTime.parse(String,dateTimeFormatter) 的三个 DateTimeParseException

转载 作者:行者123 更新时间:2023-12-02 11:17:21 25 4
gpt4 key购买 nike

我想简单地制作一个在 OffsetDateTime 解析器中使用的 DateTimeFormatter 。但我得到 DateTimeParseException:

final DateTimeFormatter ISO_LOCAL_DATE;
ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY,2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR,2)
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE,2)
.toFormatter().withResolverStyle(ResolverStyle.STRICT).withChronology(IsoChronology.INSTANCE);

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss");
OffsetDateTime.parse("2012-03-06T00:00:00",ISO_LOCAL_DATE);

我研究了一个类似的问题,但也没有任何线索:/上面的代码有什么问题?与 Formatter 或 Threeten lib 有关吗?

最佳答案

您没有在输入数据中指定偏移量。

这是带有偏移量的日期时间示例:

2012-03-06T00:00+01:00

ZonedDateTime 示例:

2012-03-06T00:00+02:00[Europe/Paris]

Europe/Berlin - 此处可被视为 ZoneId。但每个区域在一年中的不同时间(夏季/冬季)可能有不同的偏移量。

ZoneIdZoneOffset 之间没有一对一的映射: Is there any way to convert ZoneId to ZoneOffset in java 8?

您可以指定 ZoneId,而不是指定 ZoneOffset,偏移量将自动确定。

然后您可以获取ZonedDateTime并将其转换为OffsetDateTime

public OffsetDateTime ZonedDateTime.toOffsetDateTime()

This creates an offset date-time using the local date-time and offset. The zone ID is ignored.

修复指定 ZoneId 的情况:

public class Main {
private static final DateTimeFormatter ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY,2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR,2)
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE,2)
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
.withChronology(IsoChronology.INSTANCE)
.withZone(ZoneId.systemDefault()); // or whatever you have

public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.parse("2012-03-06T00:00:00", ISO_LOCAL_DATE);
System.out.println(zonedDateTime);
System.out.println(zonedDateTime.toOffsetDateTime());
}
}

大约输出:

2012-03-06T00:00+01:00[Europe/City]
2012-03-06T00:00+01:00

修复的第二个选项 - 将 offsetId() 添加到解析器构建器并指定输入字符串的偏移部分:

public class Main {
private static final DateTimeFormatter ISO_LOCAL_DATE = new DateTimeFormatterBuilder()
.appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
.appendLiteral('-')
.appendValue(MONTH_OF_YEAR, 2)
.appendLiteral('-')
.appendValue(DAY_OF_MONTH, 2)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY,2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR,2)
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE,2)
.appendOffsetId()
.toFormatter()
.withResolverStyle(ResolverStyle.STRICT)
.withChronology(IsoChronology.INSTANCE);

public static void main(String[] args) {
OffsetDateTime offsetDateTime = OffsetDateTime.parse("2012-03-06T00:00:00+02:00", ISO_LOCAL_DATE);
System.out.println(offsetDateTime);
}
}

输出:

2012-03-06T00:00+02:00

您可以指定自己的偏移模式,而不是 .appendOffsetId(),例如:

.appendOffset("+HH:mm", "Z")

顺便说一句,您可以使用大量标准 DateTimeFormatter 来解析 OffsetDateTime

public class Main {
public static void main(String[] args) {
String offsetStringTime = "2012-03-06T00:00:00+02:00";
OffsetDateTime offsetDateTime = OffsetDateTime.parse(offsetStringTime);
OffsetDateTime offsetDateTime2 = OffsetDateTime.parse(offsetStringTime, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
OffsetDateTime offsetDateTime3 = OffsetDateTime.parse(offsetStringTime, DateTimeFormatter.ISO_ZONED_DATE_TIME);
System.out.println(offsetDateTime);
System.out.println(offsetDateTime2);
System.out.println(offsetDateTime3);
}
}

输出:

2012-03-06T00:00+02:00
2012-03-06T00:00+02:00
2012-03-06T00:00+02:00

关于java - OffsetDateTime.parse(String,dateTimeFormatter) 的三个 DateTimeParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50177162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com