数据库中的 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 ZONEtimestamp 相比,在应用于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 时间的主要内容,如果未能解决你的问题,请参考以下文章

用户日期时间设置为 GMT,如何将日期转换为其本地化设置?

GMT 和 UTC 一样吗? [复制]

为啥 GMT 是计算机时间的标准而不是 UTC?

雪花 GMT 字符串到日期转换

将 MySQL 数据库时区设置为 GMT

shell 统计GMT0 时区的数据