美文网首页
node 和 mysql 里时区的理解

node 和 mysql 里时区的理解

作者: 真鬼大师 | 来源:发表于2017-11-09 14:59 被阅读0次

    mysql 里的 timestamp

    select current_timestamp();
    

    这个会根据系统时间和时区, 与数据的时间和时区进行计算. 比如系统时间是 2017-10-09 14:00:00, +8区. 更改数据库时区后上述方法会获得的结果如下.

    SET TIME_ZONE ='+00:00'; -- 得到 ... 06:00:00
    SET TIME_ZONE ='+04:00'; -- 得到 ... 10:00:00
    

    个人理解取出来的都是 设置时区里的当地时间.

    timestamp 类型和 datetime 类型

    创建一个测试的表, 两个类型的字段各一个

    CREATE TABLE test
    (
        id INT PRIMARY KEY AUTO_INCREMENT,
        tdatetime DATETIME,
        ttimestamp TIMESTAMP
    );
    

    timezone 还在 +8

    insert into test (tdatetime, ttimestamp) VALUES ('2017-10-10 00:00:00', '2017-10-10 00:00:00');
    

    这时候如果不改时区, 直接 select, 拿到的两个值都是和插入的一模一样的. 把时区改成 +4 后, 得到的结果分别为 2017-10-10 00:00:002017-10-09 20:00:00, 说明 datetime 和时区好像没关系, 插入什么就是什么. 而 timestamp 会根据时区进行计算, 返回 当地时间. 据说 timestamp 存储的时候已经转换成 utc 秒数了. 用current_timestamp() 的时候也是同理, 先根据时区计算出当地时间, 再插入.

    在 node 里操作的时候

    connection.query('select * from test where id=1', function (error, results) {
        console.log(results[0]);
    });
    
    // 查询结果, 这条数据是上面插入的那个
    // 插入的都是在 +8 的 2017-10-10 00:00:00
    {
      tdatetime: 2017-10-09T16:00:00.000Z,
      ttimestamp: 2017-10-09T16:00:00.000Z,
      id: 1 
    }
    

    node 里 mysql 连接也是在 +8 区, ttimestamp 好理解, +8区 的 2017-10-10 00:00:00 对应到 utc 就是 2017-10-09 16:00:00, 实际无论设到几区, ttimestamp 都是不变的.

    而 tdatetime, 则也变成了 T16:00, 想下应该是因为数据库连接是 +8, 程序认为我们取出的是 +8 的时间, 然后 -8 转换为 utc 时间. 那么我们把连接时区设为 +4. 结果是

    {
      tdatetime: 2017-10-09T20:00:00.000Z,
      ttimestamp: 2017-10-09T16:00:00.000Z,
      id: 1 
    }
    

    说明确实如我们所想, 也就是说, 如果是 datetime 类型, 那么在插入 取出的时候要保持时区一致, 否则时间就会不对.
    而 moment 转化的时候, 则是根据系统时区, 转换为当地时间.

    相关文章

      网友评论

          本文标题:node 和 mysql 里时区的理解

          本文链接:https://www.haomeiwen.com/subject/zkwpmxtx.html