我们如何动态更改 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 响应中的时区?的主要内容,如果未能解决你的问题,请参考以下文章
如何将JSON响应转换为Java List-使用Rest Assured进行API测试