数据库中是否有任何可能性,我应该给予哪些时间作为GMT时间戳。如果是这样,请与我分享。
答案 0 :(得分:3)
对于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
在应用于timestamptz
时与timestamp
的效果不同效果! Read the manual carefully
答案 1 :(得分:2)
timestamp with time zone
中的时间(以及旧式timestamp
,但通常不应该使用它)始终以PostgreSQL中的UTC(“GMT”)存储。它们被转换为UTC和来自UTC进行显示。如果您希望将它们视为UTC以进行输入和输出:
SET timezone = 'UTC'
在每个会话中,或在数据库或用户级别设置param。然后,如果您的应用程序位于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)
答案 2 :(得分:2)
http://dev.mysql.com/doc/refman/5.5/en/datetime.html
MySQL将TIMESTAMP值从当前时区转换为UTC 存储,并从UTC返回到当前时区进行检索。 (对于其他类型,例如DATETIME,不会出现这种情况。)默认情况下, 每个连接的当前时区是服务器的时间。
答案 3 :(得分:0)
您要寻找的关键字是UTC而不是GMT(“对于大多数常见用途,UTC与GMT同义,但GMT不再由科学界精确定义。”,wikipedia)。
对于MySQL,您可以使用CONVERT_TZ()功能(请注意手册中有关指定时区的警告,如果未正确设置,它可能会破坏您的查询。)
请注意:在MySQL和您的应用程序之间使用时区转换没有100%可靠的方法(请参阅my blog post about mysql time zone conversions详细了解这是为什么)。最好将您的日期时间字符串直接传递给UTC(例如,通过在应用程序中进行转换)。如果需要可靠性,几乎总是使用UTC格式的日期字符串在DATETIME字段中存储日期时间。