当前位置: 首页 > 面试题库 >

用于UTC或带有时区的时间戳的SQL标准

酆奇文
2023-03-14
问题内容

我正在寻找一种标准的SQL方法,以确保独立于数据库而在UTC中具有带有时间戳的列,或作为具有时区信息的时间戳。在DB列中存储时间戳UTC的UTC示例:

  • 存储的UTC值= 2014-01-01 15:30:00.000

印度当地时间21:00 / 9pm作为当地时间戳“ 2014-01-01 21:00:00.000”

  • 存储的UTC值= 2013-12-31 23:30:00.000

印度当地时间05:00 / 5am作为当地时间戳“ 2014-01-01 05:00:00.000”

以UTC方式,应用程序必须应对时区划分

现在我真的不知道是否可能,带有上述值的时间戳和时区

  • 存储的本地值= 2014-01-01 21:00:00.000

印度当地时间21:00 / 9pm作为当地时间戳“ 2014-01-01 21:00:00.000”

但是有时区信息吗?

或如何获取此时间戳的时区信息?

  • 存储的本地值= 2014-01-01 05:00:00.000

印度当地时间05:00 / 5am作为当地时间戳“ 2014-01-01 05:00:00.000”

但是有时区信息吗?

或如何获取此时间戳的时区信息?

希望有人可以帮助我摆脱困境?是否存在关于时区问题和存储数据以供国际应用的良好实践?


问题答案:

要存储时刻(时间轴上的一点),请定义SQL标准类型的数据库列TIMESTAMP WITH TIME ZONE

在UTC中存储一会儿。

Instant instant = Instant.now() ;  // Capture the current moment in UTC. 
myPreparedStatement.setObject( 鈥� , instant ) ;

在UTC中检索片刻。

Instant instant = myResultSet.getObject( 鈥� , Instant.class ) ;

从UTC调整为时区。相同的时刻,不同的挂钟时间。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;  // Specify time zone in proper `Continent/Region` name, never the ambiguous non-standard 3-4 letter pseudo-zone such as `IST` or `PST`. 
ZonedDateTime zdt = instant.atZone( z ) ;

从时区调整为UTC。相同的时刻,不同的挂钟时间。

Instant instant = zdt.toInstant() ;

日期时间不是字符串

严重的数据库不会将日期时间值存储为字符串。不要将数据库或Java库生成的字符串 表示形式 与日期时间值本身混淆。

商店UTC

最佳实践是对数据库和其他存储以及大部分业务逻辑使用UTC。仅在用户期望的时间显示在当地时区。

有关标准日期时间类型,请参见Wikipedia
。即使您不使用Postgres,也请查阅有关日期时间数据类型的出色文档。但是我确实推荐Postgres,原因有很多,包括对日期时间的出色支持。

使用 TIMESTAMPZ

这位Postgres专家提出了简单而明智的建议:始终将TIMESTAMP与TIME
ZONE一起使用

该数据类型的 名称用词不当 ,引起了很多混乱。
存储时区信息。这意味着要遵守输入数据指示的时区,并将存储的值调整为UTC。认为TIMESTAMP WITH TIME ZONETIMESTAMP WITH RESPECT FOR TIME ZONE。大声地重读此段落三遍,然后阅读以上链接,并做一些实验以确保您理解。

您可能还需要单独存储原始时区信息。不适用于您的业务逻辑,而用作调试的日志信息。

爪哇

对于Java,请确保避免使用java.util.Date和.Calendar类。他们出了名的麻烦。在Java
8中,新的java.time软件包已将它们替换。使用该软件包和/或启发了java.time的Joda-Time 2.4库。

时区

并且在Java中,始终指定所需的时区。如果省略,您将隐式使用JVM的当前默认时区。该隐式默认值意味着您的结果将随时间和空间而变化。这是日期时间工作中许多麻烦的根本原因。如果要使用UTC,请在Joda-
Time中使用常量DateTimeZone.UTC

忽略时区不会使您的生活更轻松。

ISO 8601

这个标准是非常有用和明智的。学习出色的Wikipedia页面。应该是String表示形式的首选。



 类似资料:
  • 我正在尝试使用Joda在一个简单的Java程序中获取UTC时间戳: 程序输出如下: 毫秒值是正确的UTC时间(即用时区确认)第二个值是时区。 我需要的是UTC值不变为(即独立于TZ),用于数据库写入。这可能吗? 我知道是本地日期(GMT-4),是UTC(GMT-0)。日期的输出值如下: 我尝试了所有组合,试图将的UTC值作为java.sql.TimeStamp: 用于测试的打印输出: 第一行是正确

  • 返回我女巫是错误的。 但接下来的查询如下: 我看对日期

  • 问题似乎在这个文件中:https://github.com/brianc/node-postgres/blob/master/lib/types/textparsers.js 如果从Postgres返回的日期字符串没有指定时区(例如或),那么它只会构造一个JavaScript日期对象,我相信它只会包括本地时区。

  • 我有一个Java客户机,它正在以UTC格式在MySQL DB中插入(通过CSV和'Load DATA Infile')时间戳(type TIMESTAMP)。我的服务器的时区是“America/New_York”,我需要保留夏令时信息。11月5日凌晨2点是美国东部时间转换到东部时间的时候,时钟拨回一个小时到凌晨1点。例如,11月5日凌晨1:30,发生两次;EDT和EST各一次。 我该如何让服务器区

  • 从MariaDB转移到postgres-10后,我得到下面的错误我使用Django-orm 函数日期格式(带时区的时间戳,未知)不存在第1行:选择(日期格式(在,'%h%p')创建)为“以小时为单位”,求和(。。。 提示:没有与给定名称和参数类型匹配的函数。您可能需要添加显式类型转换。 谁能解释一下哪里出了问题。非常感谢。