我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发送提醒消息,比如"您第二天有约会",那就错了,因为客户今天有约会.

推荐答案

Appointments are not moments

约会不应该被当做时刻.在future 预订的约会,如果是由一天中的某个时间决定的,就不能被限制在时间线上的某个特定时间点.

原因是政治时间由政客控制.这些政客可以随时心血来潮地改变他们管辖的时区规则.因此,如果你试图确定明年1月23日下午3点的约会时间,你会在politicians decide to stay on Daylight Saving Time year-round点的时候早点或晚点到达.否则你将在politicians decide to change their clock to match that of a neighbor号的时候休息半小时,以示外交姿态.

因此,你应该把约会作为一个日期和一天中的某个时间,但要把时区分开.所以有two个不同的值.

  • 在Java中,这意味着LocalDateTimeZoneId.
  • 在SQL中,这意味着一列类似于SQL标准类型TIMESTAMP WITHOUT TIME ZONE的列,以及另一列文本类型的时区名称.

当您需要建立时间表时,您可以通过将LocalDateTimeZoneId相结合来动态确定时刻,从而生成ZonedDateTime.请勿存储此结果-当政客更改时区规则时,此结果将无效.

请注意,上面的预约是针对牙医、发型师和摄影师的,是针对一天中特定时间的预约.相比之下,计划与natural次Bundle 在一起,比如根据预期的天气条件安排火箭emits .这样的计划不会因政客改变时区规则而改变.这样的计划使用类似于SQL标准类型TIMESTAMP WITH TIME ZONE和Java类型Instant(尽管通过OffsetDateTime类与数据库交换)的列来记录.

我以前在Stack Overflow上发布过这一点,其他人也是如此.搜索以了解更多信息.

Java相关问答推荐

Apache POI:使用反射获取zoom 级别

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

Java中如何根据Font.canDisplay方法对字符串进行分段

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

JOOQ中的子查询使用的是默认方言,而不是配置的方言

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

Java17支持哪个MapR版本?

使用htmlunit和java单击按钮

try 使用Spring集成和MySQL实现发件箱模式时,锁定等待超时

如何在列表(链表)中插入一个新 node (作为prelast)

EXCEL中的公式单元格显示#NAME?

如何在EL处理器中定义带有命名空间的变量?

使用SWIG将C++自定义单元类型转换为基本Java类型

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

Java返回生成器的实现

如何判断元素计数并在流的中间抛出异常?

Java 8 中 ByteBuffer 和 BitSet 的奇怪行为

与配置类中的自动装配字段相反是什么意思?

日落/日出时间计算出错