存储日期时间的实用方法是什么,以便我可以让用户查看/查询自己当地时间的数据,同时保留有关原始日期时间的信息。
基本上,用户希望能够查询(从他们自己的本地时间开始)从不同时区的系统收集的数据。但偶尔,他们想知道数据是在原始系统中的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,不是他们当地的时间。
答案 0 :(得分:5)
由于用户可以居住在不同的时区,甚至可以从一个时区移动到另一个时区,最佳做法是以UTC格式存储日期和时间,并在显示时转换为用户的时区。
答案 1 :(得分:4)
本手册中有一节专门针对时间戳:
TIMESTAMP值的转换 UTC的当前时区 存储,并从UTC转换回来 到目前的时区 恢复。 (这只发生在 TIMESTAMP数据类型,不适用于其他类型 类型,如DATETIME。)默认情况下, 每个当前时区 连接是服务器的时间。该 时区可以设置为 每个连接基础,如中所述 第9.6节“MySQL服务器时区 支持”。只要时区 设置保持不变,你回来了 你存储的价值相同。如果你存储 一个TIMESTAMP值,然后更改 时区并检索值, 检索值不同于 你存储的价值。这是因为 同一时区不用于 双向转换。该 当前时区可用作 time_zone系统的值 变量
因此,您可以在客户端上使用:SET time_zone = timezone;
来设置时区。然后,所有查询都会将时间戳转换为正确的时区。除了设置时区(我想甚至可能是JDBC连接字符串中的参数)之外,无需在Java中执行任何复杂的操作(
答案 2 :(得分:0)
您始终可以将zulu时间作为所有计算的基础。