【问题标题】:How can we dynamically change the timezone in java rest api response?我们如何动态更改 java rest api 响应中的时区?
【发布时间】: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
  • 我不知道最好的方法,但是,假设您有办法知道当前响应所需的 TZ,您需要注册一个自定义序列化程序(杰克逊的 ZonedDateTimeSerializer 可能是复制或扩展的良好开端,另请参阅 Jackson 的模块)读取所需的 TZ 并使用适当的格式化程序。但是,我认为向用户自己的 TZ 显示日期是表示层的责任! 祝你好运!
  • 我建议将时间存储在 UTC 时区,让客户端更改为所需的时区。如果这不可能,您将不得不编写自定义序列化程序来更改请求中存在的时区

标签: java spring-boot timezone jersey rest


【解决方案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 获取时区。

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 1970-01-01
    • 2020-05-21
    • 2017-09-03
    • 1970-01-01
    • 2019-09-21
    • 2021-04-16
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多