【问题标题】:how to use utc in postgres timestamp with jdbc PrepareStatement parameter?如何在带有 jdbc PrepareStatement 参数的 postgres 时间戳中使用 utc?
【发布时间】:2015-12-21 20:11:18
【问题描述】:

我在 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 时区工作?

【问题讨论】:

    标签: postgresql jdbc timestamp


    【解决方案1】:

    您需要在创建准备好的语句之前设置Calendar tzCal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));。

    更新的代码片段

        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。

    【讨论】:

    • 是的,谢谢,我也找到了这个:Timestamp.valueOf(LocalDateTime.now(ZoneId.of("UTC")));
    猜你喜欢
    • 1970-01-01
    • 2014-01-09
    • 2014-11-21
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2013-02-18
    • 1970-01-01
    • 2012-05-20
    相关资源
    最近更新 更多