Postgresql JDBC 使用时区读取数据

Posted

技术标签:

【中文标题】Postgresql JDBC 使用时区读取数据【英文标题】:Postgresql JDBC read data with timezone 【发布时间】:2017-02-27 13:22:01 【问题描述】:

我正在使用 Postgresql JDBC 来从与我的客户端系统具有不同时区的另一台服务器读取数据。

读取数据有一些日期类型的列。我希望这些列成为客户端系统时区,为了做到这一点,我认为应该有一种方法告诉 JDBC 服务器的时区是什么。

我正在使用带有 pypsark 的 JDBC。

有什么帮助吗?谢谢。

【问题讨论】:

【参考方案1】:

timestamptz 数据在您检索时会自动转换为 Java 默认时区。

您可以使用 java.util.TimeZone.setDefault(java.util.TimeZone) 更改此默认设置。

由于它为整个 JVM 设置了时区,这非常具有侵入性,我将向您展示如何将时间戳格式化为某个时区:

java.sql.ResultSet rs = stmt.executeQuery();
rs.next();
// fetch the first result column as java.sql.Timestamp object
java.sql.Timestamp d = rs.getObject(1, java.sql.Timestamp.class);
// create a calendar with the appropriate time zone
java.util.Calendar cal = java.util.Calendar.getInstance(
        java.util.TimeZone.getTimeZone("Asia/Kolkata"));
// create a DateFormat with the appropriate format and locale
java.text.DateFormat df = java.text.DateFormat.getDateTimeInstance(
        java.text.DateFormat.MEDIUM,
        java.text.DateFormat.MEDIUM,
        java.util.Locale.ENGLISH);
// tell the DateFormat to use the calendar with the right time zone
df.setCalendar(cal);
// output will be in the chosen time zone
System.out.println("timestamp = " + df.format(d));

【讨论】:

使用TimeZone.setDefault 可能不是一个好主意,它可能会搞砸应用程序的其他部分。 该问题要求这些列成为客户端系统时区,并想知道如何设置它。但我可以添加信息如何将数据转换到某个时区。

以上是关于Postgresql JDBC 使用时区读取数据的主要内容,如果未能解决你的问题,请参考以下文章

jdbc PostgreSQL 中的偏移时间(带时区的时间)

如何在 Azure Databricks 中使用 JDBC 从 PostgreSQL 读取表数据?

使用 JDBC 插入 PostgreSQL 时间类型时出错

如何在 JPA 2 实体中映射 postgresql“带有时区的时间戳”

logstash 读取MySQL数据到elasticsearch 相差8小时解决办法

logstash 读取MySQL数据到elasticsearch 相差8小时解决办法