MySQL/MariaDB:存储带有时区的日期时间

chr*_*s01 6 mysql datetime mariadb

我尝试将日期时间(即带有时钟时间的日历日期)存储在表中。

据我所知,DATETIME 类型没有时区。

TIME 类型仅限于 1970 年至 2038 年。

我生活在一个夏季(CEST)和冬季(CET)时区不同的国家。因此,当我们从 CEST 切换到 CET 时,有一个双小时 3。

当我无法获得包含时区的日期时间并且需要区分这个小时 3 时,我别无选择,只能手动处理它。

例如,为其添加另一列或将任何 DATETIME 转换为 UTC。

这是唯一的方法还是我错过了什么?

Ric*_*mes 7

这取决于你真正在做什么。

  • “活动”日历——音乐会在特定时区晚上 8 点开始。
  • 某事发生时的通用时间。
  • ...(时区大约有 5 种不同的需求。)

MySQL/MariaDB 只有 2 个:

  • DATETIME——把它想象成一张时钟的图片。这就是在所在时区看到的内容
  • TIMESTAMP——把它想象成宇宙中的这个实例。或者认为是通过从时区转换为 UTC 来实现的,并存储 UTC 值。(当你SELECT这样做时,就会转换回来。)

如果其中任何一个对您有用,那就使用它。如果没有,我可能建议存储TIMESTAMP加上时区偏移量(以分钟为单位),但这仅适用于历史数据。所有的偏移量(目前)都是(我认为)以分钟为单位的(整小时、30 分钟或 45 分钟)。(荷兰曾经有过精确到秒的偏移量。)大多数国家/地区与 UTC 的时间相差几个小时。印度是最大的有半小时偏移的国家(因为它是整个国家的一个时区),但还有许多其他时区有半小时偏移(澳大利亚/阿德莱德和澳大利亚/达尔文)甚至 45 分钟偏移(太平洋/查塔姆),有些有夏令时(澳大利亚/阿德莱德),而另一些则没有(澳大利亚/达尔文,最后一次 DST 更改是在 1944 年)。