再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();