【发布时间】:2019-11-08 18:41:06
【问题描述】:
我目前正在使用 Spring-Boot 构建一个从 PSQL 数据库读取数据的网关。 PSQL 数据库 v11.3 由运行 Rails 5.1.3 的 Rails Web 应用程序填充。 Spring 应用正在使用 Java 8 和 Spring Data JPA。
相关查询由 Spring 应用程序中的计划方法运行,该方法将当前时间与表的 updated_at 时间进行比较。查询如下:
@Query("SELECT d from SimulatedDeviceEntity d WHERE d.updatedAt > :currentTime")
List<SimulatedDeviceEntity> findByLastUpdated(@Param("currentTime") Timestamp currentTime);
如果我从这个查询中检索一个SimulatedDeviceEntity 并从getUpdatedAt 获取它的时间,它的类型是java.sql.Timestamp。当使用toString() 显示时,我得到2019-06-26 17:24:20.034923 用于在我当地时间13:24 更新的设备。
我尝试了各种关于如何在 UTC 中生成时间戳的答案,包括 here 我创建时间戳的代码是
LocalDateTime ldt = LocalDateTime.now();
ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("GMT"));
Timestamp currentTime = Timestamp.valueOf(zdt.toLocalDateTime());
无论我尝试什么,在其中任何一个上调用 toString 都会在我的本地时间生成时间戳,比 UTC 晚 4 小时。我已经明白这是故意的,但是当在从 Rails 应用程序检索到的时间戳上调用 toString 时,即使它们以 UTC 显示。
鉴于 toString 应该以当地时间显示时间戳,它以 UTC 时间显示为我的 last_updated 时间的事实让我相信这里还有其他东西在起作用。
【问题讨论】:
-
Java SQL Timestamp to ZonedDateTime 的可能重复项(但未答复)。另见Java - Convert java.time.Instant to java.sql.Timestamp without Zone offset。不要使用
Timestamp。 Spring JPA 应该能够处理Instant、OffsetDateTime或LocalDateTIme。 -
感谢 Ole 的信息。我到达
Timestamp,因为updated_at值自动转换为它,即:Date updatedAt = device.getUpdatedAt();logger.info("updatedAt class: " + updatedAt.getClass()); -> java.sql.Timestamp注意,我会为此尝试另一种类型。
标签: java datetime jdbc spring-data-jpa spring-jdbc