gpt4 book ai didi

java - Java/Spring 中带有逗号分隔符的 iso-8601 解析器

转载 作者:行者123 更新时间:2023-12-05 09:37:01 29 4
gpt4 key购买 nike

根据 http://apiux.com/2013/03/20/5-laws-api-dates-and-times/我们应该使用 ISO 8601 来格式化日期。我系统上的输出是:

$ date --iso-8601=ns
2020-10-29T10:38:59,112768965+01:00

哪个 java 格式化程序正确地解析了这个字符串?我试过 DateTimeFormatter.ISO_OFFSET_DATE_TIME 和其他几个,他们不喜欢这种格式。正如 Oracle 在其页面 https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html 上声称的那样,我希望开箱即用地支持这种格式。但事实并非如此。

另一件事是 Spring 宣布了对日期格式的广泛支持: https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.3-Release-Notes#date-time-conversion-in-web-applications .然后我可以将所有属性设置为“iso”。但它到底是哪种格式,它在哪里使用?

我在这里看到两个问题。

我希望在整个应用程序中采用一致的日期格式方法,并且我希望使用标准轻松地与世界其他地方集成。我应该使用什么?

编辑:最后碰巧有几点需要考虑:

  • 来自 Linux 控制台的示例是人为的,因为我在现实世界中没有注意到这种带有“,”的格式。事实证明,Java 世界对它的支持略有不一致
  • ObjectMapper、ModelMapper 和 OffsetDateTime 使 Date 对象转换不同,尤其是转换为 ISO 格式('Z' 或 '00:00')
  • Java 中也存在“0000”形式的偏移量定义,我不得不修复我的转换

最佳答案

ISO 8601-1 允许 ,. 作为小数点分隔符,尽管在实践中这是我第一次看到 ,实际上在使用中。 JDK 11 中的默认格式仅支持解析 .(即使文档说小数点分隔符已本地化)。要处理这种格式,您有一些选择:

  1. 解析前修改字符串:
OffsetDateTime.parse(value.replaceAll(",", "."));
  1. 定义自定义格式:
 new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(ISO_LOCAL_DATE)
.appendLiteral('T')
.appendValue(HOUR_OF_DAY, 2)
.appendLiteral(':')
.appendValue(MINUTE_OF_HOUR, 2)
.optionalStart()
.appendLiteral(':')
.appendValue(SECOND_OF_MINUTE, 2)
.optionalStart()
.appendLiteral(',')
.appendFraction(NANO_OF_SECOND, 0, 9, false)
.parseLenient()
.appendOffsetId()
.toFormatter()
.parse(value)
  1. 使用使用 , 分隔符的语言环境(确认在 JDK 15 中工作):
DateTimeFormatter.ISO_OFFSET_DATE_TIME.localizedBy(Locale.FRANCE).parse(value);

似乎没有办法定义允许 ,. 但不能同时允许两者的格式。您必须尝试一个捕获异常并尝试另一个,或者检测它的格式(例如 value.contains(","))并使用适当的格式化程序。

关于java - Java/Spring 中带有逗号分隔符的 iso-8601 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64588798/

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