java - 在 JPA MySql 中存储与时区无关的时间的最佳方法
问题描述
我在 JPA 中找不到一个很好的解决方案来将与时区无关的时间存储在 mysql 数据库中。
我有一个班次表,我需要在其中存储每个班次的开始和结束时间。
+-------------+--------------+------+-----+----------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+----------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(64) | NO | | NULL | |
| start_time | time | NO | | 00:00:00 | |
| end_time | time | NO | | 00:00:00 | |
+-------------+--------------+------+-----+----------+----------------+
因此,从 mysql 检索的开始/结束时间必须被视为字符串(不应用特定时区)。但是,如果我将它们存储为 varchar(8),我将无法使用以下查询(不应用从 varchar 到时间的任何类型转换)。
select * from shift where ('21:30:00' BETWEEN start_time and end_time );
所以,我想保留将它们作为时间进行比较的能力。
我尝试将班次表建模如下:
@Entity
public class Shift {
@Id
private Long id;
@Column(name = "name")
private String name;
@Column(name = "start_time")
private LocalTime startTime;
@Column(name = "end_time")
private LocalTime endTime;
...
start_time 和 end_time 映射为 LocalTime,因为 LocalTime 不存储时区信息。但是,Hibernate 将检索到的每条记录的 java.util.Date 转换为应用系统默认时区的 LocalTime,如下所示:
if ( Date.class.isInstance( value ) ) {
final Date ts = (Date) value;
final Instant instant = Instant.ofEpochMilli( ts.getTime() );
return LocalDateTime.ofInstant( instant, ZoneId.systemDefault() ).toLocalTime();
}
因此,生成的开始/结束时间与服务器的时区有关。
一种解决方案是将它们存储为整数并将小时与分钟分开。这样,班次表就会有四列:start_hours、start_minutes、end_hours、end_minutes。但是在 JPA 中使用它们进行查询很乏味。有更好的解决方案吗?
更新
我必须使用服务器的时区来获取当前班次。因此,如果我将时间作为 UTC 存储在数据库中,然后我查询它们,将当前服务器时间转换为 UTC 不起作用,因为在夏令时 (DST) 期间,服务器时区增加一。因此,在冬季,07:00:00+01 转换为 06:00:00 UTC。但是,在夏季 07:00:00+02 转换为 05:00:00 UTC。
解决方案
欢迎来到
最好将带有UTC 时区的日期存储在数据库中并在客户端进行转换。您可以设置以下属性以强制 JPA 使用 UTC
spring.jpa.properties.hibernate.jdbc.time_zone=UTC
希望这会有所帮助
你可以看看这个博客
推荐阅读
- javascript - 考虑向树中添加错误边界以自定义错误处理行为
- r - 在 TUKEY 测试中更改重要性字母的顺序
- r - 在没有 RSelenium 的情况下在 R 中抓取帧?
- react-native - 如何将对象映射到 Material-ui 输出
- azure - 如何创建 Azure API 网关资源?
- php - 使用 Symfony 5/Twig“数组到字符串转换”的嵌套数组问题
- java - 我得到一个变量值为零,即使它在java中分配了一些值
- angular - SASS 样式未完全加载
- node.js - 将信息从数据库返回到服务器 - 异步/回调函数语法?
- python - 从invest.com 上抓取历史经济数据