数据库中的GMT时间

时间:2012-08-22 11:09:58

标签: mysql database postgresql ms-access

数据库中是否有任何可能性,我应该给予哪些时间作为GMT时间戳。如果是这样,请与我分享。

4 个答案:

答案 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字段中存储日期时间。