0

数据库中是否有任何可能性,无论何时给我应该存储为 GMT 时间戳。如果是这样,请分享给我。

4

4 回答 4

3

对于 PostgreSQL,您的表应该有一个类型timestamp with time zonetimestamptz简称)的列,如下所示:

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;
    
  • atimestamp 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具有不同的效果仔细阅读手册timestamptztimestamp

于 2012-08-22T16:14:20.773 回答
2

时间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)
于 2012-08-22T12:12:54.873 回答
2

http://dev.mysql.com/doc/refman/5.5/en/datetime.html

MySQL 将 TIMESTAMP 值从当前时区转换为 UTC 进行存储,并从 UTC 转换回当前时区进行检索。(这不会发生在其他类型,例如 DATETIME。)默认情况下,每个连接的当前时区是服务器的时间。

于 2012-08-22T12:13:10.720 回答
0

您要查找的关键字是 UTC 而不是 GMT(“对于最常见的目的,UTC 是 GMT 的同义词,但 GMT 不再由科学界精确定义。”,维基百科)。

对于 MySQL,您可以使用CONVERT_TZ()函数(请注意手册中有关命名时区的警告,如果设置不正确,它可能会破坏您的查询)。

请注意:没有 100% 可靠的方法来处理 MySQL 和您的应用程序之间的时区转换(请参阅我关于 mysql 时区转换的博客文章,详细了解为什么会这样)。最好将您的日期时间字符串直接以 UTC 格式传递给 MySQL(例如,通过在应用程序本身中进行转换)。如果您需要可靠性,您几乎总是使用 UTC 格式的日期字符串将日期时间存储在 DATETIME 字段中。

于 2012-08-22T20:37:54.217 回答