玩到一个转换时间戳的问题,突然想知道它能怎么变。。。


时间戳能表示一份数据在某个特定时间之前已经存在的、完整的、可验证的数据,通常是一个字符序列就像1530693131572,唯一地标识某一刻的时间。使用数字签名技术产生的数据签名的对象包括原始文件信息、签名参数、签名时间>等信息。时间戳广泛运用在知识产权保护、合同签字、金融账务、电子报价投标、股票交易等方面。

时间转时间戳

方法有五种,都是通过实例化时间对象Date()来获取当前的时间戳,为了防止测试结果不一致,这里实例化一个时间对象data来进行五种方法测试;
第一种:通过原型方法直接获得当前时间的毫秒值,比较准确

1
2
var t1=data.getTime();
console.log("第一种方法时间戳"+t1)

第二种:通过valueOf()函数返回指定对象的原始值获得准确的时间戳值

1
2
var t2=data.valueOf();
console.log("第二种方法时间戳"+t2)

第三种:将时间转化为一个number类型的时间戳值

1
2
var t3=Number(data);
console.log("第三种方法时间戳"+t3)

第四种:貌似多年前学ASP.NET的时候用到过类似的,不过那个是DataTime.Now;

1
2
var t4=Date.now();
console.log("第四种方法时间戳"+t4)

第五种:不太厉害,毫秒级别的数值被转化成000

1
2
var t5=Date.parse(data);
console.log("第五种方法时间戳"+t5)

时间艺术
时间艺术

时间戳转时间

直接用时间对象Date来对上面得到的时间戳1530693131572进行转化

1
var T=new Date(1530693131572)

转化的艺术
转化的艺术

对这个格式不太满意的话,可以再利用toLocaleDateString()方法返回该日期对象,再正则匹配将/替换成-,再将对象的时间部分转换为字符串,到这一步之后还剩yyyy-MM-dd hh:mm:ss GMT+0800(中国标准时间),这时候再用substr方法取从0到8的字符打印出来就是yyyy-MM-dd hh:mm:ss的时间格式了。

1
T.toLocaleDateString().replace(/\//g, "-") + " " + T.toTimeString().substr(0, 8);

正则的艺术
正则的艺术

toLocaleDateString在不同的浏览器显示方法是不一样的,需要注意一下,火狐下面显示的日期格式是yyyy-MM-dd,IE11是yyyy-MM-dd,谷歌版本低于58的时候yyyy/MM/dd,版本大于等于58的时候是yyyy-MM-dd,所以如果上面出现的效果不对或者报错,是因为toLocaleDateString()因浏览器而异。

解决方法:
分别获取时间的年月日然后拼接:

1
2
3
4
5
6
7
function getDate(){
var data=new Date();
let year=data.getFullYear();
let month=("0"+(data.getMonth()+1)).slice(-2);
let day=("0"+data.getDate()).slice(-2);
return year + "-" + month + "-" + day + " " + data.toTimeString().substr(0, 8);
}

还有一个问题就是在微信小程序中,你偶然会使用

1
new Date('2019-06-20 02:18').getTime()

这样的方式将一个时间转换成时间戳,但是部分机型会返回undefined或者Invalid date,这是我在做一个打卡小程序的打卡时间判断的时候遇到的,它在某些机型可以返回正常的时间戳,但是在一些机型变成NaN打印出来
解决方法:
写成

1
new Date('2019-06-20 02:18'.replace(/-/g,"/")).getTime()

意思是把时间中的-替换成/,就像2019-06-20 02:18变成2019/06/20 02:18

正好今天百度2018AI开发者大会,share一下我早上截屏到的几张美照

新时器--这是表白的时候定的玫瑰花快递刚好送到
新时器--这是表白的时候定的玫瑰花快递刚好送到

见证历史的时刻--Apollo3.0面向量产,更加开放
见证历史的时刻--Apollo3.0面向量产,更加开放

昆仑--百度自研的中国第一款云端全功能AI芯片
昆仑--百度自研的中国第一款云端全功能AI芯片