【问题标题】:How to validate Date value in ISO Standard format for Instant type field using JsonFormat annotations or any other spring date annotations?如何使用 JsonFormat 注释或任何其他春季日期注释验证 Instant 类型字段的 ISO 标准格式的日期值?
【发布时间】:2020-03-25 03:47:43
【问题描述】:

我正在尝试使用 ISO 模式 pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") 验证 Java 中 Instant 字段的有效日期格式,我收到一条错误消息,指出 JSON parse error: Cannot deserialize value of type java.time.Instant from String \"2019-11-25T14:43:22.602Z\" 任何人都可以帮我验证 Instant 类型的日期使用注释的字段。

这是我在代码中给出的方式:

@JsonFormat(shape = JsonFormat.Shape.STRING ,pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Instant processingEndDate;

@JsonFormat(pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
private Instant processingEndDate;

我为这个 Instant 类型使用的值和格式,它没有被解析。

Sample value: 2019-11-25T14:43:22.602Z

Format I used:yyyy-MM-dd'T'HH:mm:ss.SSS'Z'

【问题讨论】:

标签: java spring-boot java-time iso date


【解决方案1】:

使用Z——不要忽略它

不要在Z 周围加上引号。将'Z' 更改为Z。使用yyyy-MM-dd'T'HH:mm:ss.SSSZ。您的引号使 Z 字符未处理,被忽略。

但是 Z 字符提供了重要信息:这意味着与 UTC 的偏移量为零时分秒。

@JsonFormat( shape = JsonFormat.Shape.STRING , pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" )
private Instant processingEndDate

尝试默认设置

此外,您可能根本不需要指定格式模式。此格式是标准 ISO 8601 格式。 java.time 类在解析/生成字符串时默认使用这些标准格式。您的格式是java.time.Instant 的特定默认值。

所以,虽然我不知道您特定的 JSON 处理库,但我建议您尝试完全不指定格式。看看默认设置是否能完成工作。

【讨论】:

  • 谢谢,但添加 timeZone 为我修复了它,以获得正确的日期。因此,通过这种方式,只有 ISO 默认模式日期被强制传递,而不是指定格式以外的任何其他格式。
【解决方案2】:

为@JsonFormat 注释添加timezone 修复了它。

[回答]

@JsonFormat(shape = JsonFormat.Shape.STRING ,pattern="yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", timezone = "UTC")
private Instant processingEndDate;

【讨论】:

  • my AnswerZ 在输入字符串中表示 UTC,但由于格式化模式 'Z'Z 周围的单引号而被忽略。您的解决方案是针对损坏的格式模式的解决方法。最好只修复格式模式而不是不必要地使用解决方法。
猜你喜欢
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2015-10-15
  • 2019-01-15
  • 2014-06-08
相关资源
最近更新 更多