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:00
和 2017-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 转化的时候, 则是根据系统时区, 转换为当地时间.
网友评论