如何在postgres时间戳中使用utc和jdbc PrepareStatement参数?

时间:2015-09-24 09:19:16

标签: postgresql jdbc timestamp

我在pg9.4上使用 timestamp 数据类型,但to_json出现了非常奇怪的问题。

现在我在上海,UTC + 08:00时区。

见下文:

    conn.createStatement().execute("set time zone 'UTC'");

    String sql = "select to_json(?::timestamp) as a, to_json(current_timestamp::timestamp) as b";
    PreparedStatement ps = conn.prepareStatement(sql);
    Timestamp timestamp = new Timestamp(new Date().getTime());      
    ps.setTimestamp(1, timestamp);

    ResultSet rs = ps.executeQuery();
    while(rs.next()){
        System.out.println("a " + rs.getString("a") + ", b " + rs.getString("b"));
    }

输出:     a“2015-09-24T16:52:42.529”,b“2015-09-24T08:53:25.468191”

这意味着当我使用jdbc将TIMESTAMP参数传递给pg时,时区仍然在上海,而不是UTC。

这个问题不是由于to_json函数,我已经创建了一个带有一个时间戳列的表,这个问题仍然存在,上面的代码是最短的样本。

如何让所有时间戳都以UTC时区工作?

1 个答案:

答案 0 :(得分:0)

您需要在创建预备声明之前设置Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

更新代码SNIPPET

    conn.createStatement().execute("set time zone 'UTC'");

    String sql = "select to_json(?::timestamp) as a, to_json(current_timestamp::timestamp) as b";

    Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));

    PreparedStatement ps = conn.prepareStatement(sql);
    Timestamp timestamp = new Timestamp(new Date().getTime());      
    ps.setTimestamp(1, timestamp);

    ResultSet rs = ps.executeQuery();
    while(rs.next()){
        System.out.println("a " + rs.getString("a") + ", b " + rs.getString("b"));
    }

这样您就可以在JDBC调用中将时区设置为UTC。

如果要以UTC格式运行整个应用程序/ JVM,请在启动JVM时设置-Duser.timezone=UTC标志。

HTH。