在数据库中存储时区的正确方式是什么?

17
让我解释一下:我不是在询问如何在数据库中正确存储特定日期时间的时区。我在谈论时区本身。例如:
我有一个名为“users”的MySQL表。现在,在这个表上,我希望有一个包含用户所在时区的列(由用户提供,将从列表中选择)。我正在使用PHP,它有像这样的时区字符串列表: 美洲的时区列表 现在,显而易见的解决方案(至少对我来说)是在“users”表中创建一个VARCHAR列,然后将PHP使用的时区字符串存储在该列中。
现在我想想,那会假设我将始终使用PHP与该数据库表进行交互,尽管现在是真的,但未来可能不是这样。而且(如果我错了,请纠正我)PHP的时区字符串可能不适用于其他编程语言,也许其他语言有自己的时区处理“常量”。
那么,您如何处理将用户的时区首选项保存在DB列中呢?任何想法都非常感激。
注意:PHP时区的有用之处在于,即使DST生效,它们也会自动考虑到这一点,这非常棒。因此,您可以看到我使用它们而不仅仅是存储数字偏移量的兴趣。

您可以在数据库中存储数字偏移量,并创建一个 PHP “config” 文件,将数字偏移量映射回 PHP 的时区字符串。 - Passerby
4
“偏移量”并不等同于“时区”。有许多时区在一年中会改变偏移量,而许多不同的时区也可能有相同的偏移量。 - Matt Johnson-Pint
@MattJohnson 只要您的程序知道如何将它们“翻译”回语言特定的常量,就可以存储任何格式的偏移量。您可以为加利福尼亚州存储“-8.1”,为另一个地方(不是美国人,所以不太清楚 :)) 存储“-8.2”,而不是为整个-8区存储“-8”。 - Passerby
1
@路人甲 - 想法不错,但目前数据库中有548个时区。这将是一项相当艰巨的任务,回报却很少。请参见http://en.wikipedia.org/wiki/List_of_tz_database_time_zones。 - Matt Johnson-Pint
1个回答

22
“而且(如果我错了,请纠正我)PHP的时区字符串可能不适用于其他编程语言。”
“好的,我会的。 :)”
“PHP实现了IANA/Olson/TZDB/ZoneInfo数据库(同一事物的许多名称)。这是最接近行业标准的东西,在几乎每种编程语言和平台上都有实现。”
“唯一不支持它的操作系统是Microsoft Windows,因为微软维护自己的时区数据库。因此,对于以Windows为中心的平台,如.Net,如果您想要支持该时区样式,则必须使用。”
“在时区标签wiki维基百科上阅读更多信息。”
“所以是的 - 您只需将时区ID字符串存储为varchar。这是最好的做法。”

不知道这个,太棒了!我会把时区字符串ID存储为varchar的。非常感谢! - Emmanuel Figuerola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接