数据库中是否有任何可能性,无论何时给我应该存储为 GMT 时间戳。如果是这样,请分享给我。
4 回答
对于 PostgreSQL,您的表应该有一个类型timestamp with time zone
(timestamptz
简称)的列,如下所示:
CREATE TABLE tbl (id serial, ts timestamptz);
如果您要存储的(我们称之为my_ts
)是...
一个local ,即它与您客户端中
timestamp without time zone
的当前设置一致: 按原样插入,所有内容都在内部自动保存为 UTC:timezone
INSERT INTO tbl (ts) VALUES my_ts'
a
timestamp with time zone
:
按原样插入,所有内容在内部自动保存为 UTC:INSERT INTO tbl (ts) VALUES my_ts;
a
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(夏令时)规则。此相关问题中的详细信息。
有关 PostgreSQL 中时间戳处理的更多信息,请参阅此相关答案。
现在,如果您想显示tbl.ts
为 UTC (~ GMT) timestamp without time zone
,无论您当前的时区如何,请检索如下值:
SELECT ts AT TIME ZONE 'UTC' FROM tbl;
请注意,应用于与使用时AT TIME ZONE
具有不同的效果!仔细阅读手册。timestamptz
timestamp
时间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)
http://dev.mysql.com/doc/refman/5.5/en/datetime.html
MySQL 将 TIMESTAMP 值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。(这不会发生在其他类型,例如 DATETIME。)默认情况下,每个连接的当前时区是服务器的时间。
您要查找的关键字是 UTC 而不是 GMT(“对于最常见的目的,UTC 是 GMT 的同义词,但 GMT 不再由科学界精确定义。”,维基百科)。
对于 MySQL,您可以使用CONVERT_TZ()函数(请注意手册中有关命名时区的警告,如果设置不正确,它可能会破坏您的查询)。
请注意:没有 100% 可靠的方法来处理 MySQL 和您的应用程序之间的时区转换(请参阅我关于 mysql 时区转换的博客文章,详细了解为什么会这样)。最好将您的日期时间字符串直接以 UTC 格式传递给 MySQL(例如,通过在应用程序本身中进行转换)。如果您需要可靠性,您几乎总是使用 UTC 格式的日期字符串将日期时间存储在 DATETIME 字段中。