我目前正在使用 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
时间,这一事实让我相信这里还有其他因素。
实际上,当您比较两个时间戳时,不需要将它们转换为同一时区。将它们作为绝对时间进行比较是足够明智的。它的作用是将任何时间戳
转换为自1970年1月1日00:00UTC以来经过的毫秒的长
值,然后对它们进行比较。因此,您可能不需要转换时间。它应该按原样工作。