Spring JSON转换器将日期格式“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”转换为OffsetDateTime(不带偏移)

时间:2019-03-22 11:22:58

标签: java datetime jackson java.time

我一直在从JSON输入中以“ yyyy-MM-dd'T'HH:mm:ss.SSSXXX”格式接收日期,而Spring自身将其转换为DTO。但是,当转换为OffsetDateTime实例时,这将丢失所创建的OffsetDateTime实例中有关Offset的信息。例如,我们在邮递员调用API中传递了以下内容,这导致解析和对象被创建,但对象中未设置偏移量。

以下是"2019-03-21T06:43:56.235+11:00"日期的示例,该日期在解析时会以OffsetDateTime实例产生日期,但没有+11:00作为偏移量。当我使用DateTimeFormatter直接解析此字符串时,便可以填充偏移量。

下面的

是使用DateTimeFormatter的代码。

OffsetDateTime.parse(offSetDateTimeString, DateTimeFormatter.ofPattern(DATE_PATTERN))

DATE_PATTER = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"

请指导。

谢谢。

更新

我的DO有以下对象:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

private String name;

// THis won't work as it doesn't support timestamp.
// @Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
// private LocalDateTime localDateTime;

@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private ZonedDateTime zonedDateTime;

@Column(columnDefinition = "TIMESTAMP WITH TIME ZONE")
private OffsetDateTime offSetDateTime;

虽然DTO也具有与SAME数据类型相同的字段。

1 个答案:

答案 0 :(得分:0)

好的,这是我为解决此问题所做的事情。

  1. 我没有接受DTO中的OffsetDateTime,而是接受了String。为此,我需要在映射器(MapStruct)中进行更改。我为OffsetDateTime映射器类定义了自定义字符串,并在uses的{​​{1}}中指定了它们。
  2. 这解决了我与解析有关的问题,然后转到DB,我注意到了几件事。

    1. 带时区的TIMESTAMP不能以给定的确切格式存储日期。
    2. 您需要使用ZoneId将时间转换为适当的时区。而且,您必须为这种转换编写自定义实用程序。
    3. 我们现在需要获取相关时区的zoneId对象,该对象当前已从传入请求中获取。

这是到目前为止的更新。发布此内容以供他人参考。谢谢大家的指导。