【问题标题】:How do I convert Unix timestamp in milliseconds to a Timestamp compatible with PostgreSQL?如何将 Unix 时间戳(以毫秒为单位)转换为与 PostgreSQL 兼容的时间戳?
【发布时间】:2021-08-20 20:44:21
【问题描述】:

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

Long start = 1622648253010;
Long end = 1622651853010;

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

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

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

但这不起作用。

【问题讨论】:

标签: java postgresql unix timestamp unix-timestamp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    除以 1000 并使用 to_timestamp)

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

    【讨论】:

      【解决方案3】:

      java.time

      java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用,改用modern Date-Time 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.timemodern Date-Time API*


      * 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 和 7 . 如果您正在为一个 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 2019-03-03
        • 2020-06-24
        • 2016-03-04
        • 2018-10-10
        相关资源
        最近更新 更多