时间日期处理

时间对象

参数

// 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过滤器

网站导航

网站导航

你可能感兴趣的:(时间日期处理)