【问题标题】:Query timezone - db server & client machine have different time zones查询时区 - 数据库服务器和客户端机器有不同的时区
【发布时间】:2015-05-06 19:02:54
【问题描述】:

(这是Time zone storage in PostgreSQL timestamps的后续行动)

我使用的是 PostgreSQL 9.x,数据库服务器的默认时区为 +9,例如,它有一个包含 timezone 类型列的表。

在与数据库相同的服务器上有一个Java程序,它从数据库中查询数据。 db驻留的服务器和Java服务器程序的客户端(浏览器)都在时区-8

我的问题是:

  • 客户端(浏览器)会显示原始日期时间还是调整后的日期时间提前 9 - (-8) = 17 小时?
  • 如果我想在浏览器客户端中获取与 db 原始值相同的数据,我应该更改 Java 服务器机器或客户端机器的时区,还是两者都更改?
    (我知道最好让db 及其服务器具有相同的时区,但我们假设由于某种原因它们现在没有设置相同的时区。)

【问题讨论】:

    标签: java postgresql datetime timezone


    【解决方案1】:

    总是收到same data in browser client as the db original value。有许多不同的方式来显示相同​​的时间点(在不同的时区)。两个示例(timestamptz 值的文本表示):

    '2012-03-05 20:00:00+03'
    '2012-03-05 18:00:00+01'
    

    相同的

    就 Postgres 而言,服务器的时区设置与此完全无关。唯一相关的是会话的设置。唯一改变的是值的显示。它总是在同一个时间点。

    所以只需在会话中设置时区即可获得相应的文本表示:

    另一个选项是AT TIME ZONE 构造。要获得timestamp 作为本地 timestamp without time zone

    SELECT my_timestamptz_column AT TIME ZONE '-8';
    

    在处理table that contains a column of timezone type 时,这可能是更好的方法,因为每一行的时区都可以改变。

    同样,所有这些都在参考答案中:

    【讨论】:

    • 所以值总是一样的,只是不同时区的不同浏览器客户端会根据本地时区调整显示值,对吗?
    • @EricWang:主要是。 “它的本地时区”有点模糊。与 Postgres 相关的是当前会话的设置 timezone。我添加了另一个链接。如果您的客户使用的时区与会话中声明的时区不同,那是您的责任。
    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2017-09-19
    • 2013-07-17
    • 1970-01-01
    • 2018-11-04
    • 2022-11-16
    • 2018-08-31
    • 1970-01-01
    相关资源
    最近更新 更多