【问题标题】:MySQL - TIMESTAMP field type automatically converts to UTC?MySQL - TIMESTAMP 字段类型自动转换为 UTC?
【发布时间】:2012-10-18 09:26:02
【问题描述】:

TIMESTAMP 字段类型与时区相关的行为是什么?

是否有任何时间戳值按原样插入到该字段中?

还是假设插入的时间戳值的时区是服务器本地时间并将其转换为UTC?

编辑:

这是我的测试

  • 我同时运行了 PHP date() 和 MySQL 的 SELECT NOW(),它们输出的时间戳大致相同。两者的结果都不是UTC时间。

  • 我尝试通过从 PHP date() 获取的 TIMESTAMP 字段的值插入到测试表中

  • 来自 PHP date() 的值应该已经转换为 UTC。但是,我在数据库中看到的不是 UTC。 TIMESTAMP 字段的值按原样插入。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    TIMESTAMP 值始终保存为 UTC。

    MySQL 将 TIMESTAMP 从当前时区转换为 UTC 进行存储,然后从 UTC 转换回当前时区进行检索。

    默认时区是服务器时区,可以在连接上设置。见this

    更多详情见MySQL Doc

    我可以通过一个例子来解释这一点。请在 mysql 控制台中执行查询:

    mysql> CREATE TABLE `testtable` (
             `date_timestamp` TIMESTAMP NOT NULL,
             `date_datetime` DATETIME NOT NULL
           )
           ENGINE = InnoDB;
    Query OK, 0 rows affected (0.06 sec)
    
    mysql> SET time_zone = '+00:00';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into testtable values(now(),now());
    Query OK, 1 row affected (0.03 sec)
    
    mysql> select * from testtable;
    +---------------------+---------------------+
    | date_timestamp      | date_datetime       |
    +---------------------+---------------------+
    | 2012-10-19 05:01:38 | 2012-10-19 05:01:38 |
    +---------------------+---------------------+
    1 row in set (0.00 sec)
    
    mysql> SET time_zone = '+05:30';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql>
    mysql> insert into testtable values(now(),now());
    Query OK, 1 row affected (0.03 sec)
    
    mysql> select * from testtable;
    +---------------------+---------------------+
    | date_timestamp      | date_datetime       |
    +---------------------+---------------------+
    | 2012-10-19 10:31:38 | 2012-10-19 05:01:38 |
    | 2012-10-19 10:31:47 | 2012-10-19 10:31:47 |
    +---------------------+---------------------+
    2 rows in set (0.00 sec)
    

    【讨论】:

    • 嗯,所以您是说无论我给出什么时间戳值,MySQL 都会将其转换为 UTC。做了一些测试,似乎不是这样。我需要做类似SET time_zone = '+00:00';
    • 为我的测试和结果编辑了我的原始帖子。
    • 能否请您查看我的示例。当您查询数据库时,时区将是您的系统时区,并且 UTC 日期会自动转换。如果您想以 UTC 格式查看日期。如果您想以 UTC 格式查看日期,您应该使用 SET time_zone = '+00:00'; 设置时区
    • hmmm 所以你是说在内部,MySQL 正在将其转换为 UTC,但在 PHPMyAdmin 和 HeidiSQL 等工具中查看它会显示系统/连接时区中的时间戳?
    【解决方案2】:

    TIMESTAMPT 值按原样插入。

    【讨论】:

    • 那不是真的。
    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2011-10-11
    • 2021-08-30
    • 2021-04-20
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多