数据库中的 GMT 时间
Posted
技术标签:
【中文标题】数据库中的 GMT 时间【英文标题】:GMT time in Database 【发布时间】:2012-08-22 11:09:58 【问题描述】:数据库中是否有任何可能性,无论何时给我应该存储为 GMT 时间戳。如果是这样,请分享给我。
【问题讨论】:
如果我给 5.4.12 PM IST 意味着它应该存储为 12.4.12 PM GMT 时移表怎么样?时区只有这么多。您需要注意的只是夏令时。 是的,你是 rite Remou。我举个例子。无论我们得到什么时间戳,它都应该以 GMT 格式存储 UTC != GMT;5.4.12 PM
是什么意思?这不是时间价值,是吗?
【参考方案1】:
对于 PostgreSQL,您的表应该有一个类型为 timestamp with time zone
(简称timestamptz
)的列,如下所示:
CREATE TABLE tbl (id serial, ts timestamptz);
如果您要存储的内容(我们称之为my_ts
)是......
一个本地 timestamp without time zone
,即它与您客户端中timezone
的当前设置一致:
按原样插入,所有内容在内部自动保存为 UTC:
INSERT INTO tbl (ts) VALUES my_ts'
timestamp with time zone
:
按原样插入,所有内容在内部自动保存为 UTC:
INSERT INTO tbl (ts) VALUES my_ts;
timestamp without time zone
,但来自另一个时区:
假设您从 伦敦 的奥运会中获得了 timestamp without time zone
值,但您的客户认为您在不同的时区。使用AT TIME ZONE
构造转换时间戳:
INSERT INTO tbl (ts) VALUES my_ts AT TIME ZONE 'Europe/London';
如果您使用时区名称(而不是时区缩写,在本例中为 BST
),则会自动应用 DST(夏令时)规则。详情在此related question。
更多关于timestamp handling in PostgreSQL in this related answer。
现在,如果您想将 tbl.ts
显示为 UTC (~ GMT) timestamp without time zone
,无论您当前的时区如何,检索如下值:
SELECT ts AT TIME ZONE 'UTC' FROM tbl;
请注意,AT TIME ZONE
与timestamp
相比,在应用于timestamptz
时具有不同的效果! Read the manual carefully.
【讨论】:
感谢您的详细说明 - 可能会删除我的答案,因为您已经更全面地介绍了它。数据库中的时间很复杂,呃。【参考方案2】:http://dev.mysql.com/doc/refman/5.5/en/datetime.html
MySQL 将 TIMESTAMP 值从当前时区转换为 UTC 存储,并从 UTC 返回到当前时区进行检索。 (这不会发生在其他类型,例如 DATETIME。)默认情况下, 每个连接的当前时区是服务器的时间。
【讨论】:
【参考方案3】:timestamp with time zone
(以及旧式timestamp
,但您通常不应该使用它)中的时间始终存储在 PostgreSQL 中的 UTC(“GMT”)中。它们被转换为 UTC 或从 UTC 转换以供显示。如果您希望将它们视为 UTC 进行输入和输出:
SET timezone = 'UTC'
在每个会话中,或在数据库或用户级别设置参数。如果它们位于 UTC 以外的 TZ 中,则您的应用必须发送所有符合时区的时间戳;您已经告诉系统“当地时间”是 UTC。
如果您想将时间戳显式转换为默认时区以外的时区,AT TIME ZONE
构造会很有用,例如:
regress=# SELECT TIMESTAMP '2012-01-01 00:00:00 UTC' AT TIME ZONE '+08:00';
timezone
------------------------
2012-01-01 16:00:00+08
(1 row)
【讨论】:
【参考方案4】:您要查找的关键字是 UTC 而不是 GMT(“在大多数情况下,UTC 是 GMT 的同义词,但 GMT 不再由科学界精确定义。”,wikipedia)。
对于 MySQL,您可以使用 CONVERT_TZ() 函数(请注意手册中有关命名时区的警告,如果设置不正确,可能会中断您的查询)。
请注意:没有 100% 可靠的方式来处理 MySQL 和您的应用程序之间的时区转换(请参阅my blog post about mysql time zone conversions 详细了解为什么会这样)。最好将您的日期时间字符串直接以 UTC 格式传递给 MySQL(例如,通过在应用程序本身中进行转换)。如果您需要可靠性,您几乎总是最终使用 UTC 格式的日期字符串将日期时间存储在 DATETIME 字段中。
【讨论】:
以上是关于数据库中的 GMT 时间的主要内容,如果未能解决你的问题,请参考以下文章