我应该在 HttpCookie.Expires 和 HttpCachePolicy.SetExpires 中使用 DateTime.Now 还是 DateTime.UtcNow?

Posted

技术标签:

【中文标题】我应该在 HttpCookie.Expires 和 HttpCachePolicy.SetExpires 中使用 DateTime.Now 还是 DateTime.UtcNow?【英文标题】:Should I use DateTime.Now or DateTime.UtcNow in HttpCookie.Expires and HttpCachePolicy.SetExpires? 【发布时间】:2011-06-18 11:55:02 【问题描述】:

我应该在HttpCookie.ExpiresHttpCachePolicy.SetExpires 中使用 DateTime.Now 还是 DateTime.UtcNow?

Cookies are sending 'GMT' 时间,但我不知道如果我在 GMT+5 时发送DateTime.Now.AddDays(3) 会发生什么。与Expires HTTP header (sec 14.21) 相同。

我应该使用什么?

【问题讨论】:

【参考方案1】:

您应该使用 DateTime.UtcNow 方法,因为那是用于 cookie 的时间标准。 UTC 等同于 GMT。

来自MSDN: System.DateTime.UtcNow

获取设置为的 DateTime 对象 当前日期和时间 计算机,表示为协调 世界时 (UTC)。

它们之间的解释请参考this。

【讨论】:

我知道。问题是即使在 MSDN 页面中,他们也使用 DateTime.Now msdn.microsoft.com/en-us/library/…,这让我很烦恼。我不知道他们是否不在乎 HttpCookie.Expires 是否已经转换为 GMT:P -1 - 我不相信这是正确的 - 你使用它不应该有任何区别。 Rob,正如您所指出的那样,由于该方法的实现,技术上使用任何一种都可以。还有其他注意事项: 例如 SetExpires 方法的输出是 UTC DateTime ,因此通过传入 UTC DateTime 可以显示实现的清晰性。另一个考虑因素虽然在这种情况下不太可能,但作为一般原则很重要,如果 SetExpire 方法(我们代码库之外的方法)的实现发生变化,使其不能转换(或转换不正确),那么我们的 bug 将被引入代码,然后我们将进行修复。 (对不起,拆分评论,我按回车,然后在我编辑评论时被打断......;) @RobLevine 使用哪一个会有很大的不同。 DateTime 不存储任何偏移量,因此 DateTime.Now 可能是“2016-10-10 05:00”,而 DateTime.UtcNow 可能是“2016-10-09-23:00”。 DateTimeOffset.Now 和 DateTimeOffset.UtcNow 是一回事。【参考方案2】:

在这种情况下没关系。

在内部,.SetExpires 所做的第一件事是将您提供的日期时间转换为 UTC,然后再将其设置到 cookie 上。

请记住,只要您的日期时间使用者正确使用 DateTime 类,那么两者是相同的 - 只是一个是“基线”到 UTC 而另一个不是:

20110701T14:00:00-1:00 (British Summer Time)

20110701T13:00:00+0:00 (UTC)

表示完全相同的日期时间,即世界标准时间下午 1 点。

只要消费者正确处理这个问题(看起来是这样,在反射器中查看过),就没有区别。

如果您将其作为时间字符串传入,那么当然,它可能会有所作为,但在这种情况下不会。

您可以使用以下代码查看效果(假设您自己不在 UTC - 如果您是 - 更改您的设置以进行测试!)。一旦您要求将其转换为 UTC,它们都会输出相同的日期时间。

WriteDateTime(DateTime.Now);
WriteDateTime(DateTime.UtcNow);

public static void WriteDateTime(DateTime dateTime)

   Console.WriteLine(dateTime.ToUniversalTime().ToLongTimeString());   

【讨论】:

最好使用 DateTime.UtcNow,因为它比 DateTime.Now 快。 这个答案不正确。 DateTime 不存储任何偏移量,因此 DateTime.Now 和 DateTime.UtcNow 非常不同。这个问题与浏览器的期望有关,正确的答案是他们期望一个偏移量为 0 (UTC) 的值。所以正确的答案实际上是下面@Phil Carson 提供的答案。 @Talon: DateTime 有一个 Kind 属性,对于 DateTime.UtcNow 设置为 DateTimeKin.Utc,对于 DateTime.Now 设置为 DateTimeKind.Local;虽然没有在比较中使用(只是刻度相等),但它会影响转换。 ToUniversalTime() 如果 Kind 是 Utc 则为 Noop,如果 .Unspecified 或 .Local 则进行本地时区转换;因此,HttpCookie 方法能够在将它们“转换”为通用使用时将它们区分开来,正如 Rob 所指出的那样。

以上是关于我应该在 HttpCookie.Expires 和 HttpCachePolicy.SetExpires 中使用 DateTime.Now 还是 DateTime.UtcNow?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将 Angularjs 文件保存在我的 Web 应用程序中的啥位置,我应该如何构建我的路由和资源? [关闭]

Hibernate:我是不是应该在 hashcode() 和 equals() 方法中包含“版本”字段

FPS 和 UPS 有啥区别?我应该在游戏循环中跟踪 UPS 吗?

为啥我应该在 Angular 订阅中使用 select 和管道?

我应该如何在两个片段中使用 ViewModel?

作为开发人员,我应该如何使用 Windows Vista(和 Windows 7)中的特殊文件夹?