java如何将“20211120+01:00”格式的日期字符串解析为ZonedDateTime错误
如何将“2021-11-20+01:00”格式的日期解析为ZonedDateTime
?我试着说:
String value = "2021-11-20+01:00";
ZonedDateTime zDate = ZonedDateTime.parse(value, DateTimeFormatter.ofPattern("yyyy-MM-ddxxx"));
但是得到这个奇怪的错误:
java.time.format.DateTimeParseException: Text '2021-11-20+01:00' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {OffsetSeconds=3600},ISO resolved to 2021-11-20 of type java.time.format.Parsed
...Unsupported field: InstantSeconds...
有什么建议吗?European VIES VAT ID checking system在接收XML(SOAP)响应时使用此时间格式:<requestDate>2021-11-20+01:00</requestDate>
。与OffsetDateTime
相同的错误
有趣的是Javadoc说“三个字母(x)输出小时和分钟,带有冒号,比如“+01:30”。那么,为什么上述模式不起作用呢
也尝试了这一个-相同的错误:
ZonedDateTime zDate = ZonedDateTime.parse(value, DateTimeFormatter.ISO_OFFSET_DATE);
完整的错误日志:
Exception in thread "main" java.time.format.DateTimeParseException: Text '2021-11-20 +01:00' could not be parsed: Unable to obtain OffsetDateTime from TemporalAccessor: {OffsetSeconds=3600},ISO resolved to 2021-11-20 of type java.time.format.Parsed
at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
at java.base/java.time.OffsetDateTime.parse(OffsetDateTime.java:402)
at javaapplication5.JavaApplication5.checkVATatVIES(JavaApplication5.java:162)
at javaapplication5.JavaApplication5.main(JavaApplication5.java:65)
Caused by: java.time.DateTimeException: Unable to obtain OffsetDateTime from TemporalAccessor: {OffsetSeconds=3600},ISO resolved to 2021-11-20 of type java.time.format.Parsed
at java.base/java.time.OffsetDateTime.from(OffsetDateTime.java:370)
at java.base/java.time.format.Parsed.query(Parsed.java:235)
at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
... 3 more
Caused by: java.time.DateTimeException: Unable to obtain Instant from TemporalAccessor: {OffsetSeconds=3600},ISO resolved to 2021-11-20 of type java.time.format.Parsed
at java.base/java.time.Instant.from(Instant.java:378)
at java.base/java.time.OffsetDateTime.from(OffsetDateTime.java:365)
... 5 more
Caused by: java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: InstantSeconds
at java.base/java.time.format.Parsed.getLong(Parsed.java:203)
at java.base/java.time.Instant.from(Instant.java:373)
... 6 more
使用OpenJDK11
# 1 楼答案
tl;博士
org.threeten.extra.OffsetDate
java。Java中内置的time类不提供日期与偏移量组合的类。所以你的解析尝试毫无意义
{a1}项目旨在补充java的功能。时间。它包括^{} 类以满足您的特殊需要。将库添加到项目中
从该
OffsetDate
对象可以获得LocalDate
部分或ZoneOffset
部分。您还可以确定其他日期时间值,例如添加一天中的某个时间以获得OffsetDateTime
你评论道:
顺便提一下,我建议养成一个习惯,使用完整格式的小时偏移量,填充零,也填充分钟。虽然各种标准都允许,但我看到有多个库在缩写时失败。因此,我建议使用“+02:00”而不是“UTC+2”
下面是一些示例代码,演示您描述的场景。我们使用
Africa/Brazzaville
的时区,因为它在那个时刻的偏移量为+01:00,我们使用Europe/Kaliningrad
的偏移量为+02:00跑步的时候
就我个人而言,我质疑带偏移量的日期概念的实用价值,但这与你的问题无关
在特定的时区工作通常比仅仅使用偏移量的问题要小
我认为,更合理的做法是将区域作为一个时刻来跟踪日期,即一天开始的时间线上的点,以及指定的时区,而不是偏移量
见此code run live at IdeOne.com
对于表示一天的文本的数据交换,我建议以扩展ISO 8601的格式传输此字符串
2021-11-20T00:00+01:00[Africa/Brazzaville]
,方法是在方括号中添加时区名称# 2 楼答案
您可以自己将ur模式指定为如下字符串:
# 3 楼答案
没有只包含日期和时区的Java类型。ZonedDateTime和OffsetDateTime,顾名思义,包含日期和时间。因此,您需要创建一个格式化程序,该格式化程序将假定一天中的默认时间:
当然,一天中的小时可以是您选择的任何值:
12
例如,表示中午。但它必须是有效的