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

时间:2011-01-09 21:14:31

标签: mysql datetime database-design timezone 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*

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

我正在考虑将所有日期时间存储在UTC中,并添加一个包含原始时区名称的附加列,其形式允许我使用mysql CONVERT_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,不是他们当地的时间。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

本手册中有一节专门针对时间戳:

  

TIMESTAMP值的转换   UTC的当前时区   存储,并从UTC转换回来   到目前的时区   恢复。 (这只发生在   TIMESTAMP数据类型,不适用于其他类型   类型,如DATETIME。)默认情况下,   每个当前时区   连接是服务器的时间。该   时区可以设置为   每个连接基础,如中所述   第9.6节“MySQL服务器时区   支持”。只要时区   设置保持不变,你回来了   你存储的价值相同。如果你存储   一个TIMESTAMP值,然后更改   时区并检索值,   检索值不同于   你存储的价值。这是因为   同一时区不用于   双向转换。该   当前时区可用作   time_zone系统的值   变量

     

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

因此,您可以在客户端上使用:SET time_zone = timezone;来设置时区。然后,所有查询都会将时间戳转换为正确的时区。除了设置时区(我想甚至可能是JDBC连接字符串中的参数)之外,无需在Java中执行任何复杂的操作(

答案 2 :(得分:0)

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