我有一个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*。
- 将epoch毫秒转换为
OffsetDateTime
:
long millisStart = 1622648253010L;
OffsetDateTime odtStart = Instant.ofEpochMilli(millisStart).atOffset(ZoneOffset.UTC);
- 将
OffsetDateTime
与PreparedStatement
一起使用:
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 Backport将Java.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