UTC
将 UTC 视为 一个真实时间tm。所有其他区域和偏移只是变化。
以 UTC 时间线存储时刻。以 UTC 存储实际历史记录。
TIMESTAMP WITH TIME ZONE
在标准 SQL 中,这意味着使用数据类型 TIMESTAMP WITH TIME ZONE。数据库通常将输入调整为 UTC。有的也保存原来的时区,有的如 Postgres 用于 UTC 调整后的时区不一致。
听起来这是你需要的类型。
虽然我不使用 MySQL,但 it looks like 等效于标准类型是 TIMESTAMP。
在 Java 中,您可以将该值作为 Instant 对象检索。然后通过分配ZoneId 以ZonedDateTime 的形式呈现给用户。
在 SQL 中,您可以在检索期间指定时区。在我看来,通常最好让应用从 UTC 调整到一个区域,但请使用您自己的判断。
TIMESTAMP WITHOUT TIME ZONE
在讨论跨时区的一般时刻时,例如“我们全球所有工厂在中午 12:30 停下来吃午饭”,请使用标准类型 TIMESTAMP WITHOUT TIME ZONE。
也可以使用这种类型来安排未来的事件,该事件在未来的时区定义可能会发生变化。世界各地的政客们都表现出搞乱时区的嗜好。他们通常会在没有注意到的情况下这样做,有时只需几个星期。检索值时动态应用时区。
虽然我不使用 MySQL,但 it looks like 等效于标准类型是 DATETIME。
DATE
标准类型DATE 表示仅日期值,没有时间和时区。
如您所见,仅日期值是不明确的。对于任何给定的时刻,日期在全球范围内因区域而异。
听起来这不符合您的需求。当你提到一个日期时,你是在暗示一个时刻。无论您的业务规则是什么,也许印度时间 (Asia/Kolkata) 或芝加哥时间中午 (America/Chicago) 或 UTC 一天的第一刻开始营业。
您需要进行调查以确定您试图以数据形式表示的信息的实际含义。
所有这些都已经在 Stack Overflow 上讨论过很多次了。请在发帖前彻底搜索,现在就了解更多。
请注意,日期时间工作很棘手,而且往往违反直觉。如果您天真地认为日期时间工作应该快速简单,那么您需要了解更多信息。慢下来,学习和实验。
示例
如果您记录的是 10 月 3 日上午 8:00 在印度接受的订单,请将其存储为 UTC:2017-10-03 02:30Z,因为印度比 UTC 早五个半小时。提示:Z 是 Zulu 的缩写,表示 UTC。
如果用户想要查看与另一个时区相同的时刻,请进行调整。对于America/Chicago,这将比 UTC晚 5 小时,因此上一个日期是 10 月 2 日而不是 3 日:2017-10-02 21:30。这是与其他两个同时发生的时刻。我们有三种查看同一时刻的方式。