在数据库中存储时区的正确方法?

Posted

技术标签:

【中文标题】在数据库中存储时区的正确方法?【英文标题】:Proper way to store a timezone in a database? 【发布时间】:2013-03-27 07:27:46 【问题描述】:

让我解释一下:我不是在询问将特定日期时间的时区存储在数据库中的正确方法。我说的是时区本身。例如:

我有一个名为“用户”的 mysql 表。现在,在这张表上,我希望有一列包含用户居住地的时区(这是由用户提供的,它将从列表中选择)。我正在使用 php,它有一个时区字符串列表,如下所示:

List of TimeZones for America

现在,显而易见的解决方案(至少对我而言)是在“用户”表中创建一个 VARCHAR 列,然后将 PHP 使用的时区字符串存储在该列中。

现在我考虑一下,假设我将始终使用 PHP 与该数据库表进行交互,虽然现在确实如此,但将来可能不会如此。而且(如果我错了,请纠正我)PHP 的时区字符串可能不适用于其他编程语言,也许其他语言有自己的“常量”来处理时区。

那么,您将如何将用户的时区偏好保存在数据库列中?任何想法都会受到赞赏。

注意:PHP 时区的有用之处在于,即使 DST 生效,它们也会自动将其考虑在内,这很棒。因此,您可以看到我对使用它们的兴趣,而不仅仅是存储数字偏移量。

【问题讨论】:

您可以在数据库中存储一个数字偏移量,并制作一个 PHP“配置”文件,将数字偏移量映射回 PHP 的时区字符串。 @Passerby - 偏移量不是时区。全年有许多时区会改变偏移量,并且许多不同的时区共享相同的偏移量。 @MattJohnson 只要您的程序知道如何将它们“翻译”回特定于语言的常量,您就可以存储任何格式的偏移量。不用为整个 -8 区域存储“-8”,您可以为加利福尼亚存储“-8.1”,为另一个地方存储“-8.2”(不是美国人,所以不太了解:))。 @Passerby - 不错的想法,但目前数据库中有 548 个时区。这将是一项非常艰巨的任务,而且回报很少。见en.wikipedia.org/wiki/List_of_tz_database_time_zones 【参考方案1】:

而且(如果我错了,请纠正我)PHP 的时区字符串可能不适用于其他编程语言

好的,我会的。 :)

PHP 实现了IANA/Olson/TZDB/ZoneInfo database(同一事物有很多名称)。这是最接近行业标准的东西,几乎在所有编程语言和平台中都实现了。

唯一不支持它的操作系统是 Microsoft Windows,因为 Microsoft 维护自己的时区数据库。因此,对于以 Windows 为中心的平台,如 .Net,如果您想要支持这种时区样式,则必须使用 libraries。

在timezone tag wiki 或Wikipedia 上了解更多信息。

所以是的 - 您只需将时区 id 字符串存储为 varchar。这是最好的做法。

【讨论】:

不知道这个,太棒了!然后,我将时区字符串 ID 存储为 varchar。非常感谢!

以上是关于在数据库中存储时区的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中存储时区偏移的数据类型/结构

在 Laravel Migrations 中存储时区的最佳方法是啥

.NET 通过时区名称获取时区偏移量

在 JPA MySql 中存储与时区无关的时间的最佳方法

在 Web 应用程序中有效地处理不同的时区

mySQL 将 NOW() 存储在正确的服务器时区吗? [复制]