在数据库中存储时区
Storing timezone in a database
我将使用 MySQL 和 PHP 并且需要将时区存储在数据库中。花了一点时间阅读它,似乎我需要使用 America/Los_Angeles
之类的东西,而不是 PST
、Pacific Standard Time
、PST8PDT
、+02.00
,等等
我是存储整个 America/Los_Angeles
字符串,还是有某种整数 ID,例如 为 c# 描述的?如果是 who 字符串,最大字符数是多少?
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.) By default, the current time zone for each connection is the server's time. The time zone can be set on a per-connection basis. As long as the time zone setting remains constant, you get back the same value you store.
您应该在 table 中添加一个新列以保留您的时区,并在提取信息时转换您的时区。
America/Halifax
和 Asia/Kolkata
等时区字符串指的是所谓的 zoneinfo 数据库中的条目。读这个。 https://www.iana.org/time-zones 目前由 Internet 号码分配机构维护。它变化很大,因为它的维护者争先恐后地跟上夏令时规则和其他时间政治方面的变化。
在类 UNIX 系统上,条目存储在文件系统目录层次结构中,而不是按某个代码编号。这是对我的建议的成功实施。你可以看看它是如何工作的。
您问的是:
Do I store the whole America/Los_Angeles
string
是的。
is there some sort of integer ID for it?
不,如果您希望您的应用程序和数据库永不过时,就不要这样做。在 MySQL 的部分有一个 time_zone_id 保存区域信息数据,但没有人承诺保持这些数字不变。
当前(2021e,截至 2022 年 3 月仍然有效)数据库中最长的字符串是 posix/America/Argentina/ComodRivadavia
。它有 38 个字符长。 mysql.time_zone_name
table 有一个用 64 个字符定义的 Name
列。使用 VARCHAR(64)
来存储此信息是有意义的;匹配名称在系统中的存储方式。顺便说一句,名称都是 7 位 ASCII,因此您可以使用 ascii_general_ci
排序规则来定义存储它们的列。这应该是用户偏好时区列的一个很好的定义。
time_zone VARCHAR(64)
NOT NULL
DEFAULT 'UTC'
COLLATE ascii_general_ci
WordPress 为用户提供可用时区名称的选择列表(下拉列表),并将用户的选择存储为文本。这是一个很好的模仿例子。
我将使用 MySQL 和 PHP 并且需要将时区存储在数据库中。花了一点时间阅读它,似乎我需要使用 America/Los_Angeles
之类的东西,而不是 PST
、Pacific Standard Time
、PST8PDT
、+02.00
,等等
我是存储整个 America/Los_Angeles
字符串,还是有某种整数 ID,例如 为 c# 描述的?如果是 who 字符串,最大字符数是多少?
MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.) By default, the current time zone for each connection is the server's time. The time zone can be set on a per-connection basis. As long as the time zone setting remains constant, you get back the same value you store.
您应该在 table 中添加一个新列以保留您的时区,并在提取信息时转换您的时区。
America/Halifax
和 Asia/Kolkata
等时区字符串指的是所谓的 zoneinfo 数据库中的条目。读这个。 https://www.iana.org/time-zones 目前由 Internet 号码分配机构维护。它变化很大,因为它的维护者争先恐后地跟上夏令时规则和其他时间政治方面的变化。
在类 UNIX 系统上,条目存储在文件系统目录层次结构中,而不是按某个代码编号。这是对我的建议的成功实施。你可以看看它是如何工作的。
您问的是:
Do I store the whole
America/Los_Angeles
string
是的。
is there some sort of integer ID for it?
不,如果您希望您的应用程序和数据库永不过时,就不要这样做。在 MySQL 的部分有一个 time_zone_id 保存区域信息数据,但没有人承诺保持这些数字不变。
当前(2021e,截至 2022 年 3 月仍然有效)数据库中最长的字符串是 posix/America/Argentina/ComodRivadavia
。它有 38 个字符长。 mysql.time_zone_name
table 有一个用 64 个字符定义的 Name
列。使用 VARCHAR(64)
来存储此信息是有意义的;匹配名称在系统中的存储方式。顺便说一句,名称都是 7 位 ASCII,因此您可以使用 ascii_general_ci
排序规则来定义存储它们的列。这应该是用户偏好时区列的一个很好的定义。
time_zone VARCHAR(64)
NOT NULL
DEFAULT 'UTC'
COLLATE ascii_general_ci
WordPress 为用户提供可用时区名称的选择列表(下拉列表),并将用户的选择存储为文本。这是一个很好的模仿例子。