2015-07-20 45 views
11

我有一個在加利福尼亞州的服務器上運行的ASP.NET應用程序。服務器的當前時間是:我的cookie何時會實際到期?

  • 2015年7月20日14:00 UTC-08:00

鮑勃連接到我的服務器。鮑勃在得克薩斯州。他現在的時間是:

  • 二零一五年七月二十〇日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) 
}; 

將餅乾在24小時內到期,或將它22小時由於Bob和服務器之間的時間差會過期嗎?我知道DateTime.Now uses the server's local time,但我不清楚瀏覽器如何決定cookie過期(具體來說,用什麼時區來確定過期時間)。

+1

爲什麼不嘗試過期2小時,看看它是否立即過期? –

+0

@AndreasNiedermair部署產品很繁瑣(即需要數小時),而且我想知道在經歷這種痛苦之前會發生什麼。 – Rainbolt

+0

做一個小演示應用程序,並使用不同時區的虛擬機? –

回答

10

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)可以被視爲相同。你可以閱讀更多關於這個here

+0

我在我的開發機器上部署了一個演示應用程序,並讓另一個開發人員連接到它。他的機器比我早了兩個小時,並且設置了一個cookie在'DateTime.Now.AddHours(2)'後面過期。該cookie不會立即過期,這與您在答案中描述的內容相符。感謝您對這個問題的評論提供有用的建議。如果沒有人反駁,我會明天接受你的回答。 – Rainbolt

+0

@Rainbolt感謝您的編輯,但UT並非真正需要,因爲*通用時間戳*表示UTC(請參閱http://referencesource.microsoft.com/#mscorlib/system/datetime.cs,fddce8be2da82dfc,references)。 –

+0

沒問題。是的,我現在看到'ToUniversalTime()'調用'ConvertTimeToUtc()'。我的困惑的來源是術語,所以我想要答案有完全清楚的術語(如果像我這樣的其他人找到這個地方)。我以這種精神做了另一次編輯,因爲我不清楚什麼是「通用時間戳」。 – Rainbolt