繁体   English   中英

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

[英]How do I convert Unix timestamp in milliseconds to a Timestamp compatible with PostgreSQL?

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

Long start = 1622648253010;
Long end = 1622651853010;

我有一个 PostgreSQL 数据库,它有一个带有时间戳列的表。 我需要 select 该表中的一些数据,其中时间戳位于两个 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. 将纪元毫秒转换为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();

Trail: Date Time了解更多关于java.time现代日期时间 API *的信息。


* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API级别仍然不符合 Java-8,请检查Java 8+ API 可通过脱糖如何在 Android 项目中使用 ThreeTenABP

除以 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM