ZoneddateTime的时区更改为spring boot的自动转换请求body中的UTC

发布于 2025-01-24 02:58:21 字数 1203 浏览 0 评论 0原文

我正在尝试保留ZoneddateTime ZonedDateTime的区域IDID,该ZonedDateTime在执行帖子/放置到Spring Boot Controller时设置在前端。

我要转移的价值是: 2019-05-01T00:00:00+01:00 [欧洲/Zagreb]

post/put/put ZoneID后,该ZoneID转换为UTC并调整了小时。从技术上讲,此更新的值代表同一时间点,但是原始的ZoneID丢失了,我希望将其存储以稍后将其显示为最终用户。

// DTO
public class PriceInfoDTO {
    @JsonFormat( pattern = "yyyy-MM-dd'T'HH:mm:ssXXX['['VV']']", 
        with = JsonFormat.Feature.WRITE_DATES_WITH_ZONE_ID )
    @DateTimeFormat( pattern = "yyyy-MM-dd'T'HH:mm:ssXXX['['VV']']", iso = ISO.DATE_TIME )
    private ZonedDateTime validFrom;
}


// Controller
@PutMapping(
    path = PATH + "/{id}",
    consumes = MediaType.APPLICATION_JSON_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<PriceInfo> update(
    @PathVariable("id") final Integer id,
    @RequestBody final PriceInfoDTO dto
) {
    System.out.println(dto);
    ...
}

在我的浏览器中查看网络选项卡,从浏览器到弹簧控制器的请求具有此值(有效负载):

2019-05-01T00:00:00+01:00[Europe/Zagreb]

与格式模式相同。

当我将DTO转换为控制台时,我会得到这个结果:

2019-04-30T22:00Z[UTC]

是否有任何方法可以在请求中收到Zoneid?我应该编写自己的序列化器和避难所以实现这一目标吗?

谢谢!

I'm trying to keep ZoneId of ZonedDateTime which is set on front-end while performing POST/PUT to Spring Boot controller.

The value I want to transfer is:
2019-05-01T00:00:00+01:00[Europe/Zagreb]

After POST/PUT the ZoneId is converted to UTC and hours are adjusted. Technically this updated value represents the same point on time line, but the original ZoneId is lost and I would like to have it stored to be able to show it back later to end user.

// DTO
public class PriceInfoDTO {
    @JsonFormat( pattern = "yyyy-MM-dd'T'HH:mm:ssXXX['['VV']']", 
        with = JsonFormat.Feature.WRITE_DATES_WITH_ZONE_ID )
    @DateTimeFormat( pattern = "yyyy-MM-dd'T'HH:mm:ssXXX['['VV']']", iso = ISO.DATE_TIME )
    private ZonedDateTime validFrom;
}


// Controller
@PutMapping(
    path = PATH + "/{id}",
    consumes = MediaType.APPLICATION_JSON_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<PriceInfo> update(
    @PathVariable("id") final Integer id,
    @RequestBody final PriceInfoDTO dto
) {
    System.out.println(dto);
    ...
}

Looking at Network tab in my browser, the request from browser to Spring Controller has this value (payload):

2019-05-01T00:00:00+01:00[Europe/Zagreb]

which is the same as format pattern.

When I dump DTO to console, I get this result:

2019-04-30T22:00Z[UTC]

Is there any way to preserve ZoneId as it was received in a request? Should I write my own Serializer and Deserializer to achieve this?

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

雨落星ぅ辰 2025-01-31 02:58:21

将以下行添加到application.properties文件:

spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false

参考:

Add the following line to the application.properties file:

spring.jackson.deserialization.ADJUST_DATES_TO_CONTEXT_TIME_ZONE = false

References:

伴随着你 2025-01-31 02:58:21

也可以使用ObjectMapper进行编程设置:

objectMapper.configure(SerializationFeature.WRITE_DATES_WITH_ZONE_ID, true);
objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);

Can also be set programmatically with ObjectMapper :

objectMapper.configure(SerializationFeature.WRITE_DATES_WITH_ZONE_ID, true);
objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文