我try 在Web应用程序中添加对时区的支持.用户的时区将用于显示时间和计算.
我在StackOverflow上查阅了很多关于Hibernate、Spring Boot与时区相关的博客和帖子,但我没有找到解决方案.一些帖子描述说,使用时区只是为了向用户显示日期/时间,但这是不够的.我需要从具有用户时区的数据库加载日期时间,以便在服务器上进行计算.
我用Hibernate 拦截器(Hibernate user guide - Events)做了一些实验.Hibernate提供了用onLoad
方法实现拦截器的能力,允许在加载后修改实体.在这种情况下,拦截器应该根据从某个全局服务获得用户时区修改日期/时间字段.这看起来像是我需要的东西,但我没有任何生产经验,也不知道这是解决问题的好方法.
要求
每个用户都应该能够设置自己的时区.
时区不仅用于时间显示,还用于计算.该应用程序包括一个预订模块,其中准确的时间很重要.我们不能允许某人预约,例如10:00,因为服务器上只有8:30,因为它可能已经是下午1:00,即用户所在时区的预约时间之后3小时.
问题
我想根据当前用户设置 for each HTTP请求更改Hibernate使用的时区.如何设置Hibernate在给定请求期间使用的时区?
技术堆栈
在应用程序中,我使用Hibernate,时间总是以UTC格式保存在数据库中.在应用程序端,时间被转换为在配置中设置的时区(每个用户的时区相同).
我在应用程序中使用Quarkus,但Spring Boot的解决方案也令我满意.将Spring Boot或其他Java EE框架的解决方案重写到Quarkus对我来说不是问题.
更新1
更多背景信息
应用程序是为摄影师可以与他们的客户(和潜在客户)共享预订页面.我需要计算一下可以预约的时间.摄影师可以在他/她的时区(例如欧洲/华沙)设置8:00-16:00这样的工作时间.在这些时间里,客户可以预约.当摄影师将时区与DST(夏令时)一起使用时,在后端使用UTC和仅用于显示日期/时间的时区开始出现问题.在UTC 7:00可以是当地时区的8:00,但在DST时间将是9:00.
同样的问题是,当你试图发送通知时,比如提醒约会.我需要知道摄影师在服务器上的时区,因为我需要知道还有多少时间才能预约.例如,在20:00 UTC的时区中,UTC+12表示第二天8:00.如果我在协调世界时20:00发送提醒消息,比如"您第二天有约会",那就错了,因为客户今天有约会.