我们如何动态更改 java rest api 响应中的时区?

Posted

技术标签:

【中文标题】我们如何动态更改 java rest api 响应中的时区?【英文标题】:How can we dynamically change the timezone in java rest api response? 【发布时间】:2021-11-30 04:59:09 【问题描述】:

我们有 api: call_summary/


  "id": 2,
  "number: "xyz",
  "call_time": "2021-10-11T03:50:23Z"

我们有多个用户使用不同的时区,如 ADT、EDT、IST 等。当用户访问此 API 时,call_time 应根据用户时区进行更改。我尝试使用@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "IST"),但这不允许我们动态更改call_time。 有没有办法使用注释或过滤器来做到这一点?

【问题讨论】:

没有自动方式。您需要一种机制来获取用户的时区(例如,使用某些 API),然后将日期时间转换为该时区。第二部分请查看How to convert date time from one time zone to another time zone。 logicbig.com/tutorials/misc/jackson/… 可以帮到你 我不知道最好的方法,但是,假设您有办法知道当前响应所需的 TZ,您需要注册一个自定义序列化程序(杰克逊的 ZonedDateTimeSerializer 可能是复制或扩展的良好开端,另请参阅 Jackson 的模块)读取所需的 TZ 并使用适当的格式化程序。但是,我认为向用户自己的 TZ 显示日期是表示层的责任! 祝你好运! 我建议将时间存储在 UTC 时区,让客户端更改为所需的时区。如果这不可能,您将不得不编写自定义序列化程序来更改请求中存在的时区 【参考方案1】:

我建议将call_time 存储在两列中,UTC 和用户本地时区。

这样做可以消除两端(服务器和客户端)的复杂性和混乱

【讨论】:

这是不可能的 bcoz 用户可以随时更改他们的时区。第二件事是有一些其他对象具有相同的要求,我们不能在所有其他表中添加一个额外的列并对其进行另一组处理。【参考方案2】:

查看以下链接,它可能会对您有所帮助:Pass browser timezone to the backend springboot application to generate reports with dates as per the browser timezone。根据后者,您可以使用TimeZone 作为控制器的输入。您可以执行以下操作:

@RestController
public class TestController 
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

  @GetMapping(value = "/test")
  public String generate(TimeZone timezone) throws IOException 
    return LocalDateTime.now().atZone(timezone.toZoneId()).format(formatter);
  

或者,您可以从HttpServletRequest 获取时区。

【讨论】:

以上是关于我们如何动态更改 java rest api 响应中的时区?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中进行rest api调用并映射响应对象?

Spring REST API,响应中的自定义实体字段

如何将JSON响应转换为Java List-使用Rest Assured进行API测试

在动态信封中包装 json 响应 - Rest api

根据来自带有 JQuery 的 REST API 的 JSON 响应更改 HTML 结构

如何从动态列表中为 Vue 中的 API 响应创建列表渲染 JSON?