时间戳与时间的故事

一、时间戳定义

指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

二、时间与时间戳转换

2.1 js 获取当前时间戳的方法

var timestamp1 = Date.parse(new Date()); // 不推荐这种办法,毫秒级别的数值被转化为000
var timestamp2 = (new Date()).valueOf(); // 获取了当前毫秒的时间戳,准确。
var timestamp3 = new Date().getTime(); // getTime()返回数值的单位是毫秒

2.2 js获取指定时间戳的方法

var timestamp4 = (new Date("2018/06/22 08:00:20")).getTime()/1000;

2.3 时间戳转换为时间

var timestamp = new Date(1472048779952); // 直接用 new Date(要转换的时间戳)来获取时间戳所代表的的日期
// 注意时间戳一定要是 Int 型,否则转换会失败,ParseInt() 一下最好。

2.4 格式化日期

开发中常用到日期,但用 new Date() 或得到的无法直接用来显示给用户,所以一般我们会写一个格式化日期的方法,如下:

// 格式化日期
function dateFormat(thisDate, fmt) {
    var o = {
        "M+": thisDate.getMonth() + 1,
        "d+": thisDate.getDate(),
        "h+": thisDate.getHours(),
        "m+": thisDate.getMinutes(),
        "s+": thisDate.getSeconds(),
        "q+": Math.floor((thisDate.getMonth() + 3) / 3),
        "S": thisDate.getMilliseconds()
    };
    if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (thisDate.getFullYear() + "").substr(4 - RegExp.$1.length));
    for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
    return fmt;
}
var Date=new Date();
console.log(dateFormat(Date, "yyyy-MM-dd hh:mm:ss"))

2.5 根据日期来计算星期

2.5.1 计算当前日期的星期一与星期天
var Date=new Date();
var selectTime = Date.getTime();//获取时间戳
var selectDay = Date.getDay();//获取星期
var oneDayLong = 24 * 3600 * 1000;//定义一天有多少毫秒
var MondayTime = selectTime - (selectDay - 1) * oneDayLong;
var monday = new Date(MondayTime)//时间戳再转回时间
var SundayTime = selectTime - (selectDay - 7) * oneDayLong;
var sundayTime = new Date(SundayTime)

console.log(monday)
console.log(sundayTime)
2.5.2 计算某一日期是星期几
当我们知道某一'yyyy-mm-dd'日期时便可以计算出当前是星期几,公式如下:

基姆拉尔森计算公式:W = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。(其中mod意思是取余计算,js用的是%)

三、时间戳作用

3.1 使用背景

	客户端在向服务端接口进行请求,如果请求信息进行了加密处理,被第三方截取到请求包,可以使用该请求包进行重复请求操作。如果服务端不进行防重放攻击,就会服务器压力增大,而使用时间戳的方式可以解决这一问题。

3.2 具体使用

3.2.1 防篡改
	一般使用的方式就是把参数拼接,当前项目AppKey,双方约定的“密钥”,加入到Dictionary字典集中,按ABCD顺序进行排序,最后在MD5+加密.客户端将加密字符串和请求参数一起发送给服务器。服务器按照
上述规则拼接加密后,与传入过来的加密字符串比较是否相等
3.2.2 防复用
	上面的方式进行加密,就无法解决防复用的问题,这时需要在客户端和服务端分别生成UTC的时间戳,这个UTC是防止你的客户端与服务端不在同一个时区,haha,然后把时间戳timestamp拼在密文里就可以了
3.2.3 具体代码
// 现在还未用到具体技术,待以后补充

版权声明:本文为sunshinegirl168660原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。