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

时间:2019-06-26 18:42:37

标签: java datetime jdbc spring-data-jpa spring-jdbc

我目前正在使用Spring-Boot构建一个网关,该网关从PSQL数据库读取数据。 PSQL数据库Using rkLocalMachine As RegistryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) Using sk As RegistryKey = rkLocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion", False) Dim nValue As Integer = CType(sk.GetValue("InstallDate"), Integer) Dim dInstallDate As Date = DateTimeOffset.FromUnixTimeSeconds(nValue).DateTime MessageBox.Show("InstallDate = " + dInstallDate.ToString, "Information", MessageBoxButtons.OK, MessageBoxIcon.Information) End Using End Using 由运行Rails padding: 10px 14px;的Rails Web应用程序填充。 Spring应用程序正在使用padding: 14px 18px;和Spring Data JPA。

相关查询由Spring应用程序中的预定方法运行,该方法将当前时间与表的$horizontal-padding: 10; $vertical-padding: 14; .normal-padding { padding-top: $vertical-padding; padding-right: $horizontal-padding; padding-bottom: $vertical-padding; padding-left: $horizontal-padding; } .extra-padding { ($horizontal-padding + 2 + px), ($vertical-padding + 2 + px); } 时间进行比较。查询如下:

v11.3

如果我从此查询中检索到5.1.3并从Java 8获取时间,则它的类型为updated_at。使用@Query("SELECT d from SimulatedDeviceEntity d WHERE d.updatedAt > :currentTime") List<SimulatedDeviceEntity> findByLastUpdated(@Param("currentTime") Timestamp currentTime); 显示时,我得到SimulatedDeviceEntity的设备是在本地时间getUpdatedAt上更新的。

我已经尝试过各种有关如何在UTC中生成时间戳的答案,包括here,其中我创建时间戳的代码是

java.sql.Timestamp

无论我尝试什么,对其中任何一个调用toString()都会在我的本地时间生成时间戳,该时间比UTC晚4个小时。我已经明白这是故意的,但是在从Rails应用程序检索的时间戳上调用2019-06-26 17:24:20.034923时,即使它们以UTC显示。 鉴于13:24应该显示本地时间的时间戳记,因此它在我的世界标准时间LocalDateTime ldt = LocalDateTime.now(); ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("GMT")); Timestamp currentTime = Timestamp.valueOf(zdt.toLocalDateTime()); 时间显示的事实使我相信这里还有其他事情。

1 个答案:

答案 0 :(得分:0)

实际上,当您比较两个时间戳时,不需要将它们转换为相同的时区。将它们作为绝对时间进行比较足够聪明。它所做的是将任何Timestamp转换为Long(自1.1.1970 00:00 UTC开始经过的毫秒数)的值,然后进行比较。因此,您可能不需要转换时间。它应该可以正常工作。