java - 没有时区的时间戳中的夏令时时间偏移
问题描述
我正在使用 hibernate 与 postgresql 数据库进行通信,以存储用于建模的数据。在这些模型中,有基于没有时区的时间戳的时间序列。现在,当上传正确创建的时间戳(在本例中为 2030 年)时,2030-03-31T02:00 的时间戳在数据库中的列中结束为 2030-03-31T-03:00没有时区的时间戳。我已经更改了数据库配置,使其时区为 UTC,但问题仍然存在。
问题似乎位于驱动程序(https://mvnrepository.com/artifact/org.postgresql/postgresql/42.2.5)或数据库中。将时间戳作为字符串插入时,它可以工作。此问题也发生在本地和远程数据库上。
此外,休眠在版本 5.4.2(最新)中,在我的 persistence.xml 中我设置了标志:
<property name="hibernate.jdbc.time_zone" value="UTC"/>
我写的一个小测试是这样的:
@Test
public void testTimeShift() {
EntityManager em = JPAUtil.createEntityManager();
TimeStep timeStep = new TimeStep();
LocalDateTime.now(Clock.systemUTC());
LocalDateTime ldt = LocalDateTime.parse("2030-03-31T02:00:00");
timeStep.setTimeStamp(ldt);
SaveToDB.(timeStep, em);
em.close();
EntityManager em2 = JPAUtil.createEntityManager();
TimeStep timeStep2 = LoadFromDB.getTimeStep(ldt, em2);
if (timeStep.getTimeStamp() != timeStep2.getTimeStamp()) {
System.out.println(timeStep.getTimeStamp());
System.out.println(timeStep2.getTimeStamp());
throw new EmptyStackException();
}
}
此代码返回以下内容:
2030-03-31T02:00
2030-03-31T03:00
Process finished with exit code -1
解决方案
答案是将时间戳的类型设置为 ZonedTimeData。为方便起见,可以从 LocalDateTime 解析它。这样,测试就起作用了。
因此,与推荐的相反,对于不使用时区的时间步长:
@Entity
@Table(name = "`TimeStep`")
public class TimeStep {
@Column(name = "`TimeStamp`")
private ZonedDateTime TimeStamp;
}
创建时间步然后通过
LocalDateTime.now(Clock.systemUTC());
LocalDateTime ldt = LocalDateTime.parse("2030-03-31T02:00:00");
ZonedDateTime zonedDateTime = ZonedDateTime.of(ldt, ZoneId.of("UTC"));
timeStep.setTimeStamp(zonedDateTime);
推荐阅读
- python - 学习识别手写数字的图像和录音是指相同的数字还是不同的数字
- python - Numpy 切片多维错误产生意外结果
- swift - 如何在 wkwebview 中加载响应式网站?
- linux - egrep 正则表达式 bash 脚本中的数字变量
- python - 想将列表转换为以下示例的字符串
- julia - 朱莉娅如何解决依赖关系?
- regex - 在行尾使用 grep 中的正则表达式进行模式匹配
- java - 如何使用 Java 程序在 CodeBlocks 中打开特定的 C++ 文件?
- adobe - 需要通过扩展脚本生成和更新 .indd Indesign 文件链接的缺失 DocumentID 和 instanceID
- java - Drools:查找地图是否包含部分键并将其分配给变量