Spring MVC - 将用户时区的日期转换为UTC

时间:2015-11-16 12:46:27

标签: java spring spring-mvc datetime spring-boot

often recommended日期时间以UTC格式存储在数据库中,并以本地时区的用户显示/接收。

我正在尝试在Spring MVC / Spring Boot应用程序中实现此模式,但我们无法找到文档或示例。我在@ModelAttribute表单对象的java.util.Date属性上使用@DateTimeFormat注释来生成Spring解析/格式化日期。

Spring是否内置了对此模式的支持? Django's timezone-aware datetimes的某些方面会很好。如果不是有一个不太麻烦的方式来实现它?或者是否有更好的方法来处理/存储Spring MVC应用程序中的日期时间?

目前该应用程序仅限英国,所以目前我只需要支持BST(夏令时),而不是不同用户的不同时区。但是,支持不同时区的用户是未来的潜在需求。

1 个答案:

答案 0 :(得分:0)

希望这对你有帮助,或者至少从你可以开始的地方开始。

看起来最好的方法是使用 OffsetDateTime 类型来存储日期。将来自用户的dateTime值转换为UTC很容易:

OffsetDateTime createdOn = requestDto.getCreatedOn();
OffsetDateTime utc = createdOn.atZoneSameInstant(ZoneId.of("UTC"));

然后再回来(当然你也需要存储用户的时区):

OffestDateTime eventDate = modelObject.getEventDate();
OffsetDateTime userTime = eventDate.atZoneSameInstant(ZoneId.of(userTimeZone));

要在 UTC 中实例化新的约会对象,您可以使用时钟 - 对象:

OffestDateTime now = OffestDateTime.now(Clock.systemUTC());
ModelObject dto = new ModelObject();
dto.setEventDate(now);

最后如果你不需要显示偏移量,你可以使用 LocalDateTime 类型:

OffestDateTime eventDate = databaseModelObject.getEventDate();
LocalDateTime userTime = eventDate.atZoneSameInstant(ZoneId.of(userTimeZone)).toLocalDateTime());
ResponseDto response = new ResponseDto();
response.setEventDate(userTime);
相关问题