我的Cookie实际过期时间是什么时候?

16

我有一个在加利福尼亚州的服务器上运行的ASP.NET应用程序。该服务器当前时间为:

  • 7/20/2015 14:00 UTC-08:00

Bob连接到了我的服务器。Bob在得克萨斯州。他当前的时间是:

  • 7/20/2015 16:00 UTC-06:00

我的应用程序创建了一个cookie并设置了它的过期日期。

var name = "MyName";
var value = "MyValue"
var hoursToLive = 24;

var myCookie = new HttpCookie(name )
{
    Value = value,
    Expires = DateTime.Now.AddHours(hoursToLive)
};

这个cookie会在24小时内过期吗?还是由于Bob和服务器之间的时差,它将在22小时内过期?我知道DateTime.Now使用服务器的本地时间,但我不清楚浏览器如何决定cookie是否过期(具体来说,使用哪个时区来确定过期时间)。


1
为什么不尝试将其设置为2小时的过期时间,看看是否会立即过期呢? - user57508
制作一个小的演示应用程序,并使用具有不同时区的虚拟机? - user57508
@AndreasNiedermair 那是个好主意。 - Rainbolt
Cookie会带有一个过期属性发送到浏览器,例如:Expires=Wed, 09 Jun 2021 10:18:14 GMT。虽然我从未测试过,但浏览器应该能够很好地处理它,并在发送后24小时过期。 - David Sherret
@AndreasNiedermair 我本来想写24小时,而不是22小时(我已经改正了)。但是,既然时区已经发送,应该没有问题。 - David Sherret
显示剩余2条评论
2个回答

18

Cookie会在expires标头中包含时区信息(大多数是GMT),这使得客户端能够轻松应对与服务器实际时区的偏差。

例如:expires=Mon, 20-Jul-2015 22:00:00 GMT,如果2015-07-20 14:00:00 UTC-8是服务器时间,则当客户端或服务器决定cookie是否过期时,它会将其与关联的GMT时间进行比较。

我深入研究了System.Web.HttpCookie的代码,并在GetSetCookieHeader()中找到了相关代码:

        if (_expirationSet && _expires != DateTime.MinValue) {
            s.Append("; expires=");
            s.Append(HttpUtility.FormatHttpCookieDateTime(_expires));
        }

HttpUtility.FormatHttpCookieDateTime() 返回一个UTC时间戳(没有偏移量,因为偏移量为零无关紧要)。

格林威治标准时间(GMT)和协调世界时(UTC)在大多数情况下可以视为相同。您可以在这里了解更多信息。


我将一个演示应用部署到我的开发机器上,并让另一位开发人员连接。他的机器比我的快两个小时,而我设置了一个cookie,在 DateTime.Now.AddHours(2) 后过期。该cookie没有立即过期,这与您在回答中描述的相符。感谢您在问题评论中提供的有益建议。如果没有人反驳,我明天会接受您的答案。 - Rainbolt
@Rainbolt 谢谢你的编辑,但其实 UT 不是必需的,因为 universal timestamp 意味着 UTC(参见 http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,fddce8be2da82dfc,references)。 - user57508
没问题。是的,我现在看到 ToUniversalTime() 调用了 ConvertTimeToUtc()。 我困惑的源头是术语,所以我希望答案具有完全清晰的术语(以防像我这样的人发现此处)。 我进行了另一次编辑,因为我不清楚什么是 "universal timestamp"。 - Rainbolt

0

您的 cookie 会在所有人完全相同的时间到期...

...只是基于他们所在时区的本地时间显示在他们的时钟上不同。例如,加利福尼亚州和德克萨斯州恰好在同一时刻获得 cookie 的用户将会看到他们的 cookie 在同一时间到期,但是在他们的时钟上显示的时间不同。对于 Bob 来说,它将是下午4点,但在加利福尼亚州则是下午2点。同一时刻,只是每个使用您网站的人在不同时间的时钟上看到的时间不同。

cookie 会将所有 DateTime 到期值保存为协调世界时或Universal Coordinated Time,这是英国伦敦格林威治(英格兰)的时间。当用户将 cookie 存储在其浏览器中时,所有 cookie 到期日期-时间都以 ISO-UTC 格式存储,并在末尾带有“Z”或“GMT”,以指示它们正在使用此 UTC 值。即使对于世界各地不同的本地时间看起来可能不同,它们也包括将它们映射回 UTC 的偏移量。这意味着当您为两个不同时区的用户同时设置 DateTime 时,它们都会在同一时间到期,但在两个时区的时钟上显示的本地时间不同。

然而...

如果你想让每个人的 cookie 在他们的时区相对于午夜过期,那么是的,你需要首先使用 JavaScript 获取他们本地计算机上午夜的本地时间,然后将其转换为 UTC。使用document.cookie在 JavaScript 中创建一个 cookie。现在,他们拥有一个只在他们的时区中午夜结束的 cookie。

另一个选项...

如果你想让全世界的人都有相对于特定时区钟表(例如加利福尼亚州)在午夜过期的 cookie,那么是的......你需要获取你希望世界其他地方使用的确切日期和时间,并将其转换为 UTC 日期和时间。将该值存储在服务器上,然后将其设置为所有访问你的网站的用户 cookie 的过期时间。当加利福尼亚州的午夜到来时,世界各地的每个人的 cookie 都会再次同时过期,但是到那时匹配加利福尼亚州午夜的 UTC 值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接