Mysql 时间与时区

再Mysql, 或者 Mariadb 命令行里运行

select now();
+---------------------+
| now()               |
+---------------------+
| 2018-08-30 17:45:42 |
+---------------------+

js日期格式化函数,也可以得到类似的字符串

function timestampToTime(timestamp) {
        var date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
        var Y = date.getFullYear() + '-';
        var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
        var D = date.getDate() + ' ';
        var h = date.getHours() + ':';
        var m = date.getMinutes() + ':';
        var s = date.getSeconds();
        return Y+M+D+h+m+s;
    }

但是类似“2018-08-30 17:45:42 “ 的时间,不够精确,会随着时区的不同而不同,全球有24个时区,有24个不同结果。
在chrome浏览器下 按F12,在控制台输入以下代码,在不同的时区运行以下js 代码得到的结果是不同的

+new Date("2018-08-30 17:45:42")

但是如果在不同的时区, 几乎同一时刻,运行JS代码,

+new Date()

得到的结果应该是相同的,即使不同也仅仅相差几秒(没有验证过,只是推测)。不会像“+new Date(“2018-08-30 17:45:42”)“ 的结果相差若干个小时。

在Mysql的命令行下,结果也是一样的,比如你有一个位于其他时区的linux服务器,然后这个服务器上安装mysql / mariadb,
用mysql账户登录mysql的命令环境,分别在本地和远程的mysql命令行运行这两个sql

select now();
select unix_timestamp();

然后比较一下本地结果和远程服务器结果。可以看到两者的select now(); 执行结果差异很大,所在时区对结果有很大的影响,而第二个sql的结果和所在时区没有关系。

所以,如果需要精确的控制时间, mysql的日期或者时间 字段 最好用bigint类型,不要用varchar类型,但用bigint类型有点影响数据库数据的直观性。但可以用mysql的函数解决

select from_unixtime(left(moment, length(moment)-3) ) from users;

moment是 users表的 bigint类型的字段。其长度为13, 对应于java的long 类型, javascript 代码 +new Date() 得到的结果也是13位的时间戳。
mysql 语句 select unix_timestamp(); 得到的结果是10 位的时间戳

意图把abc表中的moment字段,varchar类型,转为bigint类型,同时要避免数据丢失,如果直接用alter语句,结果就是“2018-02-03“ 变为数字 2018了。

update abc set moment=concat(moment, " 00:00:00");
update abc set moment=unix_timestamp(moment);
alter table abc change moment moment BIGINT COMMENT '创建时间'; 
update abc set moment=moment*1000;
mysql> select now(), sleep(3), now();
mysql> select sysdate(), sleep(3), sysdate();

引用: http://www.cnblogs.com/ggjucheng/p/3352280.html

你可能感兴趣的:(Mysql 时间与时区)