如何在带有 jdbc PrepareStatement 参数的 postgres 时间戳中使用 utc?
how to use utc in postgres timestamp with jdbc PrepareStatement parameter?
我在 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"));
}
输出:
一个“2015-09-24T16:52:42.529”,b“2015-09-24T08:53:25.468191”
这意味着当我使用 jdbc 将 TIMESTAMP 参数传递给 pg 时,时区仍在上海,而不是 UTC。
这个问题不是 to_json 函数引起的,我做了一个 table 带有一个时间戳列,这个问题仍然存在,上面的代码是最短的示例。
如何让所有时间戳都在 UTC 时区工作?
您需要设置 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。
如果您想 运行 整个 application/JVM UTC,请在启动 JVM 时设置 -Duser.timezone=UTC
标志。
HTH.
我在 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"));
}
输出: 一个“2015-09-24T16:52:42.529”,b“2015-09-24T08:53:25.468191”
这意味着当我使用 jdbc 将 TIMESTAMP 参数传递给 pg 时,时区仍在上海,而不是 UTC。
这个问题不是 to_json 函数引起的,我做了一个 table 带有一个时间戳列,这个问题仍然存在,上面的代码是最短的示例。
如何让所有时间戳都在 UTC 时区工作?
您需要设置 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。
如果您想 运行 整个 application/JVM UTC,请在启动 JVM 时设置 -Duser.timezone=UTC
标志。
HTH.