1. 时间戳
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
也就是说,时间戳它是一个偏移量,比如时间戳 1551618793,就是指距离 1970-01-01 00:00:00 这个基准时间 1551618793 秒的时间,就是格林威治时间 2019-03-03T13:13:13 00:00(这个时间表示法见下面的 ISO 8601 介绍)。
2. 格林尼治标准时间
格林尼治标准时间(Greenwich Mean Time,GMT)是指位于伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时的时间。
同时格林尼治标准时间也是世界基准时间,全世界被划分为24个时区,以尼治标准时间为0时区,其他时区在此时间上加上时区偏移量,比如我们中国北京时间就是 8区,格林威治时间 2019-03-03T13:13:13 00:00,就是北京时间的 2019-03-03T21:13:13 08:00。
3. UTC
协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。
UTC时间是基于标准的GMT提供的准确时间,因此我们所说的UTC时间,也就是0时区的时间。
测试表结构
当前数据库设置的时区为 8区
插入一条记录
修改time_zone为0时区设置后查看
可以看到,DateTime类型的,并没有受时区设置变化影响,TIMESTAMP 类型自动根据修改后的当前时区设置显示了正确的时间。 这个变化,并不是修改时区后,MySQL 把 TIMESTAMP 字段的值修改了,而是显示时,根据当前时区正确显示了,存储的值并没有变化,一直是 UTC 时间。
注意点:
insert 时,TIMESTAMP 字段值必须是与 MySQL 设置的时区一致,因为 MySQL 只会根据 time_zone 参数设置的时区转换到 UTC 时间。
特点:
1. 与时区相关,内部统一使用4字节的 UTC 时间戳存储 2. insert 可以使用 MySQL 的 CURRENT_TIMESTAMP 3. update 可以使用 MySQL 的 on update CURRENT_TIMESTAMP
总结几点- 不管使用 INT、DATETIME、TIMESTAMP 哪一种,系统都必须要关心时区
- 个人建议的实践方式是将 MySQL 时区设置为 00:00,数据应该是 UTC 时间入、UTC 时间出,各系统展示时,再从 UTC 时间转换为相应的时区时间