时间对象
参数
// Wed Aug 08 2018 00:00:00 GMT+0800 (中国标准时间)
new Date('2018,8,8');
new Date('2018-8-8');
// 兼容性最好
new Date('2018/8/8');
时间戳
获取时间戳
今日当前时间
// 1533618727625 精确到毫秒
var timestamp = (new Date()).getTime();
// 1533618727625 精确到毫秒
var timestamp2 = (new Date()).valueOf();
// 1533618727000 精确到秒
var timestamp3 = Date.parse(new Date());
今日零点
var timestamp = new Date(new Date().toLocaleDateString()).getTime()
今日最晚时间 23:59:59
var timestamp = new Date(new Date().toLocaleDateString()).getTime()+24*60*60*1000-1
时间戳转日期
/**
* @desc 时间戳转日期,如果想添加时间,同时使用默认中文日期,第二个字符串传空字符串或0
* @params {Number} timestamp - 时间戳
* @params {String} mark - 连接日期的符号,如'-'、'/',默认年月日
* @params {Boolean} isTimeExist - 是否加上时间,true:加上,默认不加
* @returns {String} 返回值为日期
*/
timestampToTime (timestamp, mark, isTimeExist) {
// 时间戳为10位需*1000,时间戳为13位的话不需乘1000
var len = timestamp.toString().length;
if (len === 10) {
timestamp *= 1000;
}
// 设置默认不添加时分秒
var isAddTime = false
if (isTimeExist) {
isAddTime = true
}
// 时间戳转字符串,小于10补0
var date = new Date(timestamp);
var Y = date.getFullYear();
var M = date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1;
var D = date.getDate() < 10 ? '0'+(date.getDate()) : date.getDate();
var h = date.getHours();
var m = date.getMinutes();
var s = date.getSeconds();
var res;
if (isAddTime) {
if (mark) {
res = Y+mark+M+mark+D+' '+h+':'+m+':'+s
} else {
res = Y+'年'+M+'月'+D+'日 '+h+'时'+m+'分'+s+'秒';
}
} else {
if (mark) {
res = Y+mark+M+mark+D
} else {
res = Y+'年'+M+'月'+D+'日';
}
}
return res;
}
日期转时间戳
/**
* @params {String} time - 日期字符串,如'2018-8-8','2018,8,8','2018/8/8'
* @returns {Number} 返回值为时间毫秒值
*/
timeToTimestamp (time) {
var date = new Date(time);
var timestamp = date.getTime();
return timestamp;
}
应用
当你请求验证码时,后台返回图片的链接可能是一个不变的地址,当你把这个地址赋给图片的src后,因为地址一直不变,所以虽然验证码已经刷新了,但是展示的图片仍然是从缓存中获取的第一张图片,解决办法就是给地址加一个时间戳,因为参数不同,浏览器会认为这是一个新的请求,从而刷新数据。
还有一种可能,就是后台返回的是一张验证码图片,不是地址,此时前台如何显示,方法是一样的,返回的验证码图片的地址就是你请求的接口地址。
this.imgUrl = `http://127.0.0.1:9000/api/validateCode?time=${(new Date()).getTime()}`
验证码可能会出错,比如显示乱码,但是这是后端的问题,是服务器上缺少相应的字体,导致验证码生成错误,前端只是负责展示返回的图片。
其他
时间差
/**
* @params {String} dateOne - 日期字符串,如'2018-8-8','2018,8,8','2018/8/8'
* @params {String} dateTwo - 日期字符串,如'2018-8-8','2018,8,8','2018/8/8'
* @returns {Number} 返回值为时间毫秒值差
*/
getTimeDiff (dateOne,dateTwo) {
var secondOne = new Date(dateOne).getTime();
var secondTwo = new Date(dateTwo).getTime();
var diff = Math.abs(secondOne-secondTwo)
return diff
}
毫秒值转天时分秒
formatMS (ms) {
var days = parseInt(ms / (1000 * 60 * 60 * 24));
var hours = parseInt((ms % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
var minutes = parseInt((ms % (1000 * 60 * 60)) / (1000 * 60));
var seconds = (ms % (1000 * 60)) / 1000;
return days + " 天 " + hours + " 小时 " + minutes + " 分钟 " + seconds + " 秒 ";
}
获取星期几
getWeek (dateString) {
var date = new Date(dateString)
return "周" + "日一二三四五六".charAt(date.getDay());
}
获取两个日期之间的时间数组
getTimeArr (start, end) {
var timeArr = [];
var startIndex = new Date(start).valueOf();
var endIndex = new Date(end).valueOf();
var diffDays = (endIndex - startIndex) / 86400000;
for (var i = 0; i <= diffDays; i++) {
// 这里存储自己想要存贮的格式
// 我存储的是每日零点的时间戳
var date = new Date(new Date(startIndex).toLocaleDateString()).getTime();
timeArr.push(date);
startIndex += 86400000;
}
return timeArr;
},
判断一个日期是不是今天
// 为true则是今天
new Date().toLocaleDateString() == new Date(val).toLocaleDateString()
设置几天后的日期
convertDate (date, day) {
let tempDate = new Date(date);
tempDate.setDate(tempDate.getDate()+day);
let Y = tempDate.getFullYear();
let M = tempDate.getMonth()+1 < 10 ? '0'+(tempDate.getMonth()+1) : tempDate.getMonth()+1;
let D = tempDate.getDate() < 10 ? '0'+(tempDate.getDate()) : tempDate.getDate();
let result = Y + "-" + M + "-" + D
return result;
}
问题
1、时间不正确
可能的原因是跟时区有关,如果后台用时间对象接收,并且没有做任何处理,时间上是差着时区8小时的。处理一下即可。
另外,建议时间传递前后台交互用时间戳。
相关阅读
vue过滤器
网站导航
网站导航