如何将Unix时间戳(以毫秒为单位)转换为与PostgreSQL兼容的时间戳



我有一个REST服务,它有一个在请求的时间间隔内获取数据的端点。请求的时间间隔可以归结为两个Unix时间戳(以毫秒为单位(,类型为Long。像这样:

Long start = 1622648253010;
Long end = 1622651853010;

我有一个PostgreSQL数据库,它有一个带有时间戳列的表。我需要从表中选择一些数据,其中时间戳在两个Unix时间戳之间。但是PostgreSQL不理解Unix时间戳,所以我必须将这两个时间戳转换为PostgreSQL兼容的时间戳,然后才能在查询中使用它们。转换应该在Java中完成,而不是在SQL查询中完成。

我该怎么做?我唯一知道的是:

java.sql.Timestamp.from(Instant.ofEpochSecond(
start.getSeconds(), start.getNanos()))

但这并不奏效。

java.time

java.util日期-时间API及其格式API、SimpleDateFormat已过时且存在错误。建议完全停止使用它们,并切换到现代日期时间API*

  1. 将epoch毫秒转换为OffsetDateTime
long millisStart = 1622648253010L;
OffsetDateTime odtStart = Instant.ofEpochMilli(millisStart).atOffset(ZoneOffset.UTC);
  1. OffsetDateTimePreparedStatement一起使用:
PreparedStatement st = conn.prepareStatement(SELECT * FROM mytable WHERE columnfoo BETWEEN ? AND ?");
st.setObject(1, odtStart);
st.setObject(2, odtEnd);
ResultSet rs = st.executeQuery(); 
while (rs.next()) {
//...
}
rs.close();
st.close();

跟踪:日期时间了解有关java.time的更多信息,即现代日期时间API*


*出于任何原因,如果您必须坚持使用Java 6或Java 7,您可以使用ThreeTen BackportJava.time的大部分功能向后移植到Java 6&7.如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请检查通过desugaring和如何在Android项目中使用ThreeTenABP提供的Java 8+API

除以1000并使用to_timestamp(

select to_timestamp(1622648253010/1000);
to_timestamp      
------------------------
2021-06-02 17:37:33+02

Long类型没有方法getSeconds()getNanos()。请参阅:https://docs.oracle.com/javase/7/docs/api/java/sql/Timestamp.html#Timestamp%28long%29