问题 在数据库中存储时区


我将使用MySQL和PHP,并需要将时区存储在数据库中。花了一点时间阅读它,似乎我需要使用类似的东西 America/Los_Angeles, 并不是 PSTPacific Standard TimePST8PDT+02.00

我存储整个 America/Los_Angeles 字符串,或者是否存在某种整数ID,例如 https://stackoverflow.com/a/11580459/1032531 为c#描述?如果是谁的字符串,最大字符数是多少?


10321
2017-11-01 17:33


起源



答案:


时区字符串就像 America/New_York 参考所谓的条目 区信息 数据库。读这个。 https://www.iana.org/time-zones 它目前由互联网号码分配机构维护。它发生了很大的变化,因为它的维护人员争先恐后地跟上夏令时规则和其他临时政治内容的变化。

在类UNIX系统上,条目存储在文件系统目录层次结构中,而不是存储在某些代码编号中。

你问:

我存储整个 America/Los_Angeles 串

是。

它有某种整数ID吗?

不,如果您希望您的应用程序和数据库能够面向未来,那就不是了。在MySQL的一部分中有一个time_zone_id来保存zoneinfo数据,但没有人做出任何关于保持这些数字不变的承诺。

当前(2015g)数据库中最长的字符串是“America / Argentina / ComodRivadavia”。它长32个字符。使用它可能是有意义的 VARCHAR(64) 用于存储此信息,以便您永远不会用完。

顺便说一句,WordPress为用户提供可用时区名称的选项列表(下拉列表),并将用户选择存储为文本。

http://www.iana.org/time-zones


8
2017-11-01 18:09





点击这里 MySql DateTime

MySQL将TIMESTAMP值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索。 (对于其他类型,例如DATETIME,不会发生这种情况。)默认情况下,每个连接的当前时区是服务器的时间。可以基于每个连接设置时区。只要时区设置保持不变,您就可以获得存储的相同值。

您应该在表格中添加一个新列以保留您的时区,并在提取信息时转换您的时区。


4
2017-11-01 17:43



请描述您引用的“表格中的新列以保留您的时区”。 - user1032531
如果您需要确切知道数据库转换日期时间之前的时区,则需要保留它,因为数据库会自动转换您在服务器时区的日期时间并存储它。 - Laurentiu
我的意思是我应该使用 VARCHAR(32) 存储它?这对所有时区都足够大吗?另外,确认时区没有一些整数ID。 - user1032531
是的你应该把它存储为字符串,请点击此处 stackoverflow.com/questions/8663590/... - Laurentiu
关于长度是的,是32,这里有一个确认 stackoverflow.com/questions/3477347/php-tz-setting-length - Laurentiu


答案:


时区字符串就像 America/New_York 参考所谓的条目 区信息 数据库。读这个。 https://www.iana.org/time-zones 它目前由互联网号码分配机构维护。它发生了很大的变化,因为它的维护人员争先恐后地跟上夏令时规则和其他临时政治内容的变化。

在类UNIX系统上,条目存储在文件系统目录层次结构中,而不是存储在某些代码编号中。

你问:

我存储整个 America/Los_Angeles 串

是。

它有某种整数ID吗?

不,如果您希望您的应用程序和数据库能够面向未来,那就不是了。在MySQL的一部分中有一个time_zone_id来保存zoneinfo数据,但没有人做出任何关于保持这些数字不变的承诺。

当前(2015g)数据库中最长的字符串是“America / Argentina / ComodRivadavia”。它长32个字符。使用它可能是有意义的 VARCHAR(64) 用于存储此信息,以便您永远不会用完。

顺便说一句,WordPress为用户提供可用时区名称的选项列表(下拉列表),并将用户选择存储为文本。

http://www.iana.org/time-zones


8
2017-11-01 18:09





点击这里 MySql DateTime

MySQL将TIMESTAMP值从当前时区转换为UTC以进行存储,并从UTC转换回当前时区以进行检索。 (对于其他类型,例如DATETIME,不会发生这种情况。)默认情况下,每个连接的当前时区是服务器的时间。可以基于每个连接设置时区。只要时区设置保持不变,您就可以获得存储的相同值。

您应该在表格中添加一个新列以保留您的时区,并在提取信息时转换您的时区。


4
2017-11-01 17:43



请描述您引用的“表格中的新列以保留您的时区”。 - user1032531
如果您需要确切知道数据库转换日期时间之前的时区,则需要保留它,因为数据库会自动转换您在服务器时区的日期时间并存储它。 - Laurentiu
我的意思是我应该使用 VARCHAR(32) 存储它?这对所有时区都足够大吗?另外,确认时区没有一些整数ID。 - user1032531
是的你应该把它存储为字符串,请点击此处 stackoverflow.com/questions/8663590/... - Laurentiu
关于长度是的,是32,这里有一个确认 stackoverflow.com/questions/3477347/php-tz-setting-length - Laurentiu