您的位置:首页 > Web前端 > JavaScript

JS Cookie当天24点过期,chrome时差问题

2016-09-25 11:21 381 查看
这个问题已经过去好些天了,当时为了上一个教师节的专题,里面有一个点赞的功能需要用到cookie存储记录。一开始自己写没注意,只知道运营说一天只能点赞一次,后来他们又说要当天24点之后就又可以在点赞,当然啦,这需求改的挺好的。检查的时候发现,尼玛之前写的cookie过期时间都到2025年去了,吓得一身冷汗。是我错了,把天当毫秒用了。

JS cookie 代码,直接声明一个对象就可以用了。

var cookie = {
"setCookie": function (name, val, lifeCircle) {
//name传入的键名  val传入的键值  lifeCircle cookie生命周期(过期时间=cookie的设置时间+lifeCircle)
var oDate = new Date();//时间对象
oDate.setDate(new Date().getDate() + lifeCircle);
document.cookie = name + "=" + val + ";expires=" + oDate + ";path=/";
},
"getCookie": function (name) {
//name 为想要取到的键值的键名
var reg = /\s/g;
var result = document.cookie.replace(reg, "");
var resultArr = result.split(";");
for (var i = 0; i < resultArr.length; i++) {
var nameArr = resultArr[i].split("=");
if (nameArr[0] == name) {
return nameArr[1];
}
}
},
"removeCookie": function (name) {
//name为想要删除的Cookie的键名
var oDate = new Date();//时间对象
oDate.setDate(new Date().getDate() - 1);
document.cookie = name + "=123;expires=" + oDate + ";path=/";
}
}


注意:这里的lifeCircle是按天算的。

后来调整到当天24点过期,这中间有两个问题可以注意一下。

一是谷歌的过期时间格式和其他浏览器不同,会出现北京时间(东八区)8个小时的时差,这不是尴尬了嘛。

二是火狐用firebug看过期时间表达方式我是真一下没反应过来,下午12:00,这还真就是晚上24:00。

好了,看我后来是怎么改好的。

主要思路是当日剩余时间就是生命周期,然后当前时间加上剩余时间转化为日期格式,中间会有一个问题是时间格式问题,国际标准时间,和中国标准(北京)时间是相差8小时的时差的,但是这个问题只有在谷歌上才会有,所以通过浏览器判断即可进行区分。

//自定义cookie对象
var cookie = {
"setCookie": function(name, value) {
var curDate = new Date();
//当前时间戳
var curTamp = curDate.getTime();
//当前日期
var curDay = curDate.toLocaleDateString();
var brow = $.browser;
var curWeeHours = 0;
if (brow.safari) {
//当日凌晨的时间戳,减去一毫秒是为了防止后续得到的时间不会达到00:00:00的状态
curWeeHours = new Date(curDay).getTime() + (8 * 60 * 60 * 1000) - 1;
} else {
curWeeHours = new Date(curDay).getTime() - 1;
}
//当日已经过去的时间(毫秒)
var passedTamp = curTamp - curWeeHours;
//当日剩余时间
var leftTamp = 24 * 60 * 60 * 1000 - passedTamp;
var leftTime = new Date();
leftTime.setTime(leftTamp + curTamp);
//创建cookie
document.cookie = name + "=" + value + ";expires=" + leftTime.toGMTString() + ";path=/";
},
"getCookie": function(name) {
//name 为想要取到的键值的键名
var reg = /\s/g;
var result = document.cookie.replace(reg, "");
var resultArr = result.split(";");
for (var i = 0; i < resultArr.length; i++) {
var nameArr = resultArr[i].split("=");
if (nameArr[0] == name) {
return nameArr[1];
}
}
},
"removeCookie": function(name) {
//name为想要删除的Cookie的键名
var oDate = new Date(); //时间对象
oDate.setDate(new Date().getDate() - 1);
document.cookie = name + "=123;expires=" + oDate + ";path=/";
}
}


其实,在h5时代,我们可以换用其他的存储形式了。比如localstorage,sessionstorage等。不过我们的用户要兼容IE7,整天以泪洗面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cookie chrome 存储