7

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

基本上,用户希望能够查询(以他们自己的本地时间为准)从不同时区的系统收集的数据。但有时,他们想知道原始系统中的数据是在 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*

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

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

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

start_time_utc datetime
start_time_tz  varchar(64)
end_time_utc   datetime
end_time_tz    varchar(64)

我在正确的轨道上吗?

使用过此类数据的人会分享他们的经验吗?

(我将使用 MySQL 5.5 CE)

更新 1

数据将以 xml 文件的形式交付,其中每个条目在某个本地时区都有一个日期时间。所以只会有一个插入进程,在一个地方运行。

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

4

3 回答 3

6

由于用户可以生活在不同的时区,甚至可以从一个时区移动到另一个时区,因此最佳做法是将日期和时间存储为 UTC,并在显示时转换为用户的时区。

于 2013-01-20T07:16:51.033 回答
4

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

TIMESTAMP 值从当前时区转换为 UTC 以进行存储,并从 UTC 转换回当前时区以进行检索。(这仅适用于 TIMESTAMP 数据类型,而不适用于其他类型,例如 DATETIME。)默认情况下,每个连接的当前时区是服务器的时间。时区可以在每个连接的基础上设置,如第 9.6 节,“MySQL 服务器时区支持”中所述。只要时区设置保持不变,您就可以返回存储的相同值。如果您存储一个 TIMESTAMP 值,然后更改时区并检索该值,则检索到的值与您存储的值不同。发生这种情况是因为没有使用同一时区进行双向转换。

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

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

于 2011-01-10T15:11:10.577 回答
0

您始终可以将祖鲁时间作为所有计算的基础。

于 2011-09-28T16:46:21.650 回答