如何以UTC和本地时区存储日期时间

Ron*_*nis 7 mysql timezone datetime database-design convert-tz

什么是存储日期时间的实用方法,以便我可以让用户查看/查询自己当地时间的数据,同时保留有关原始日期时间的信息.

基本上,用户希望能够查询(从他们自己的本地时间)从各个时区的系统收集的数据.但偶尔,他们想知道数据是在原始系统中的18:00创建的.当来自世界不同地区的用户就同一事件进行通信时,它会有所帮助.

User1: What? We don't have any data for 20:00
User2: Dude, it says 20:00 right there on my screen.
User1: Wait, what timezone are you? What's the UTC-time?
User2: What is UTC? Is that something with computers?
User1: OMFG! *click*
Run Code Online (Sandbox Code Playgroud)

我正在寻找有关如何存储数据的建议.

我正在考虑以UTC格式存储所有日期时间,并添加一个包含原始时区名称的附加列,其形式允许我使用mysql CONVERT_TZ或Java中的对应物.然后,应用程序将用户输入的日期转换为UTC,我可以轻松查询数据库.所有日期也可以轻松转换为应用程序中的用户本地时间.使用原始时区列我也可以显示原始日期时间.

但是,这意味着对于我所拥有的每个日期时间,我需要一个额外的列...

start_time_utc datetime
start_time_tz  varchar(64)
end_time_utc   datetime
end_time_tz    varchar(64)
Run Code Online (Sandbox Code Playgroud)

我在这里走在正确的轨道上吗?

是否有人使用这些数据分享他们的经验?

(我将使用MySQL 5.5 CE)

更新1

数据将以xml文件的形式提供,其中每个条目在某个本地时区具有日期时间.因此,只有一个插入过程,在一个地方运行.

一旦加载到数据库中,它将在一些Web应用程序中呈现给不同时区的用户.对于大多数用例,感兴趣的数据也来自与查看数据的用户相同的时区.对于一些更复杂的用例,一系列事件是互连的并跨越多个时区.因此,用户希望能够谈论事件,以便在另一个时间调查可能的原因/后果.不是UTC,不是他们当地的时间.

Kis*_*wal 6

由于用户可以居住在不同的时区,甚至可以从一个时区移动到另一个时区,最佳做法是以UTC格式存储日期和时间,并在显示时转换为用户的时区.


shl*_*oid 4

该手册有一个专门针对此目的的部分,关于时间戳:

\n\n
\n

TIMESTAMP 值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。(这种情况仅发生在 TIMESTAMP 数据类型上,而不会发生在 DATETIME 等其他类型上。)默认情况下,每个连接的当前时区是服务器的时间。时区可以在每个连接的基础上设置,如\n 第 9.6 节,\xe2\x80\x9cMySQL 服务器时区\n 支持\xe2\x80\x9d 中所述。只要时区设置保持不变,您就会得到与存储的值相同的值。如果存储 TIMESTAMP 值,然后更改时区并检索该值,则检索到的值与存储的值不同。出现这种情况的原因是\n 两个方向的转换未使用相同的时区。当前时区可作为 time_zone 系统变量的值使用。

\n\n

http://dev.mysql.com/doc/refman/5.5/en/timestamp.html

\n
\n\n

所以你可以在客户端使用:SET time_zone = timezone;来设置时区。然后所有查询都会将时间戳转换为正确的时区。除了设置时区(我认为甚至可能是 JDBC 连接字符串中的参数)之外,不需要在 Java 中做任何复杂的事情

\n