57

我正在使用一个设置 cookie 的函数。此函数允许将 cookie 名称、cookie 值和 cookie 的附加到期日期传递给它。

function setCookie(name, value, exdate) {
    var c_value = escape(value) + 
      ((exdate === null || exdate === undefined) ? "" : "; expires=" + exdate);
    document.cookie = name + "=" + c_value;
};

用法:

setCookie("my-cookie-name","my-value","Sun, 15 Jul 2012 00:00:01 GMT");

我已经使用了上述日期格式的函数,并且相信它是跨浏览器兼容的,因为我已经测试过关闭各种浏览器并重新打开它们后 cookie 是否仍然存在。我发现使用"15 Jul 2012". 这种格式在 Firefox 的开发过程中对我有用,但其他浏览器似乎只将 cookie 设置为会话 cookie。

我应该坚持只使用这种格式:"Sun, 15 Jul 2012 00:00:01 GMT"还是有其他格式可以用于主要浏览器(IE 7-9、Firefox、Chrome、Opera、Safari)的到期日期?

4

3 回答 3

54

根据测试和进一步阅读,cookie 需要 UTC/GMT 格式的日期,例如Sun, 15 Jul 2012 00:00:01 GMT

因此,任何其他格式的日期,例如15 Jul 201215/Jul/201207/15/2012,都必须作为new Date对象传递,然后通过toUTCString()ortoGMTString()函数传递。

因此我将我的功能编辑为以下内容:

function setCookie(name, value, exdate) {
    //If exdate exists then pass it as a new Date and convert to UTC format
    (exdate) && (exdate = new Date(exdate).toUTCString());
    var c_value = escape(value) + ((exdate === null || exdate === undefined) ? "" : "; expires=" + exdate);
    document.cookie = name + "=" + c_value;
};
于 2012-06-21T12:52:05.860 回答
7

rfc 6265 中指定的用于生成 Set-Cookie 标头的语法使用
rfc1123-date = wkday "," SP date1 SP time SP "GMT"cookie 日期格式,因此"Sun, 15 Jul 2012 00:00:01 GMT"有效。

如果我理解正确,解析算法将识别其他格式,例如: 00:00:01 15 jul 2012但不应生成它们。

于 2016-05-08T21:23:53.450 回答
2

找到日期格式ddd, dd MMM yyyy HH':'mm':'ss 'GMT'。愿有人发现有用。这里也是很好的参考

于 2018-03-08T04:52:42.323 回答