【问题标题】:Retrieving time zone of date stored in database检索存储在数据库中的日期的时区
【发布时间】:2016-01-23 16:16:02
【问题描述】:

我的 J2EE 应用程序部署在集群中,服务器可以位于多个时区。例如,一台服务器位于 EST,另一台服务器位于 CST。

考虑一个场景,请求在 EST 中发送到服务器并将日期和时间存储在数据库中(没有时区)。还有另一个检索相同日期的请求。但该请求可能会发送到 CST 中的另一台服务器。

有没有办法确定数据库中存储的时区日期?

PS:我正在使用 Oracle/Java/Hibernate。

【问题讨论】:

  • 如果您将日期存储在固定时区,那么您就可以了(例如,始终转换为 UTC)。或者,您可以存储时区。否则,不,没有办法知道当地时间来自哪个时区。
  • 服务器的时区应该是无关紧要的。当您可以将数据库服务器或应用服务器时区更改为您想要的任何内容而不影响任何内容时,您就会知道您已经正确完成了。另请参阅Daylight saving time and time zone best practices

标签: java oracle hibernate date timezone


【解决方案1】:

没有。如果存储DATE没有时区,则无法查询时区。

作为开发人员,您需要决定如何处理时区。请记住,您有 3 个时区:

  • 数据库服务器时区。
  • Web 应用程序服务器时区。
  • 客户端浏览器时区。

如果洛杉矶的用户输入时间,巴黎的用户应该看到什么?

如果悉尼的用户执行操作,多伦多的用户应该看到什么操作时间戳?

在您能够回答这些问题(即定义您的要求)之前,不可能对解决方案/实施进行编码/验证。

正如评论中提到的,处理时区基本上有两种方法:

  1. 将所有日期存储在固定时区中,例如UTC,并在需要的地方进行转换,这几乎无处不在。
  2. 使用时区存储日期,并根据需要进行转换或使用时区显示。用户可能更喜欢转化,但这是由您做出的设计决定。

【讨论】:

    【解决方案2】:

    当您使用数据类型 DATETIMESTAMP 时,您没有任何有关时区的信息 - 除非您的应用程序确保在插入或更新数据时始终使用特定时区(例如 UTC)。

    Andreas 的说法并不完全正确,在 Oracle 数据库中你有三个时区:

    1. 数据库时区

      您可以使用DBTIMEZONE 询问它。它仅与TIMESTAMP WITH LOCAL TIME ZONE 数据类型列相关并定义存储格式。因此,如果数据库包含具有TIMESTAMP WITH LOCAL TIME ZONE 列的表并且该列包含数据,则您无法更改数据库上的DBTIMEZONE。请注意,不是SYSDATESYSTIMESTAMP 的时区

    2. 数据库服务器操作系统的时区

      此时区与SYSDATESYSTIMESTAMP 的结果相关。

    3. 您的会话的时区

      您可以使用SESSIONTIMEZONE 询问它。它可能由您的 Web 应用程序服务器或您的客户端浏览器时区决定。 (我不是网络技术专家)如果是胖客户端,可以在您的注册表或环境变量ORA_SDTZ 中设置它。我不知道哪个具有优先级以及当其中任何一个未定义时您会获得哪个值,它也可能因您的 Database-Provider 和驱动程序而异。用户可以随时使用ALTER SESSION SET TIME_ZONE=...更改 SESSIONTIMEZONE

    日期类型TIMESTAMP WITH TIME ZONE 存储带有时区信息的时间。您可以根据您的要求将它们转换为客户端本地时区或填充为插入的或其他任何内容。您可以使用 EXTRACT 函数或转换为字符串时获取时区值,例如TO_CHAR(TS_VALUE, TZH:TZM)TO_CHAR(TS_VALUE, TZR)

    日期类型TIMESTAMP WITH LOCAL TIME ZONE 还存储带有时区信息的时间。但是,它始终显示客户端当前会话时区的时间,您不能将其转换为任何其他时区(除非事先进行 CAST)。因此,当您尝试使用 TIMESTAMP WITH LOCAL TIME ZONE 值执行 TO_CHAR(TS_VALUE, 'hh24:mi:ss TZH:TZM') 时,会出现错误!

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2014-01-16
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      • 2021-09-27
      • 2018-09-28
      相关资源
      最近更新 更多