提问者:小点点

如何在UTC中为查询比较生成java.sql.Timestamp?


我目前正在使用 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()显示时,我为在我的本地时间13:24更新的设备获取2019-06-26 17:24:20.034923

关于如何用UTC生成时间戳,我尝试了各种答案,包括我创建时间戳的代码在这里

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时间,这一事实让我相信这里还有其他因素。


共1个答案

匿名用户

实际上,当您比较两个时间戳时,不需要将它们转换为同一时区。将它们作为绝对时间进行比较是足够明智的。它的作用是将任何时间戳转换为自1970年1月1日00:00UTC以来经过的毫秒的值,然后对它们进行比较。因此,您可能不需要转换时间。它应该按原样工作。