Java Spring MVC-从用户转换日期';将时区转换为UTC

Java Spring MVC-从用户转换日期';将时区转换为UTC,java,spring,spring-mvc,datetime,spring-boot,Java,Spring,Spring Mvc,Datetime,Spring Boot,日期时间必须以UTC格式存储在数据库中,并在本地时区向用户显示或从用户处接收 我试图在SpringMVC/SpringBoot应用程序中实现此模式,但还没有找到文档或示例。我在@ModelAttribute表单对象的java.util.Date属性上使用@DateTimeFormat注释来进行Spring解析/格式化日期 Spring是否内置了对这种模式的支持?如果能做点类似的事情就好了。如果没有,是否有一种不太麻烦的实现方法?还是有更好的方法在SpringMVC应用程序中处理/存储日期时间 目

日期时间必须以UTC格式存储在数据库中,并在本地时区向用户显示或从用户处接收

我试图在SpringMVC/SpringBoot应用程序中实现此模式,但还没有找到文档或示例。我在@ModelAttribute表单对象的java.util.Date属性上使用@DateTimeFormat注释来进行Spring解析/格式化日期

Spring是否内置了对这种模式的支持?如果能做点类似的事情就好了。如果没有,是否有一种不太麻烦的实现方法?还是有更好的方法在SpringMVC应用程序中处理/存储日期时间


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

希望这将对您有所帮助,或者至少是您可以从这一点开始

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

OffsetDateTime createdOn = requestDto.getCreatedOn();
OffsetDateTime utc = createdOn.atZoneSameInstant(ZoneId.of("UTC"));
然后再次返回(当然,您还需要存储用户时区):

要在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);

您是否将日期存储在date o Calendar对象中?您是否想过这一点?我对此也很感兴趣。@reos,我们将它存储为java.util.Datemoment@Andy不是真的。我发现在这种环境中,日期和时间被解释为在服务器JVM的时区中,因此目前我们正在将服务器的时区设置为用户所在的时区(欧洲/伦敦)我们在PostgreSQL数据库中为日期字段使用“timestamp with timezone”数据类型,以便跨夏季时间更改的日期计算能够工作。如果&当应用程序需要支持其他时区的用户时,我们将不得不重新审视我们的工作方式。好的,谢谢您的反馈!
OffestDateTime eventDate = databaseModelObject.getEventDate();
LocalDateTime userTime = eventDate.atZoneSameInstant(ZoneId.of(userTimeZone)).toLocalDateTime());
ResponseDto response = new ResponseDto();
response.setEventDate(userTime);