asp c中当前时间和cookie expiation时间之间的时间差

时间:2016-06-13 11:50:25

标签: c# asp.net cookies time

以下是我用来检查Cookie到期时间和当前时间之间的时差的代码。

HttpCookie mycookie = Request.Cookies.Get("hello");

if (mycookie == null)
{
    mycookie = new HttpCookie("hello");
    mycookie.Value = "Hello World";
    mycookie.Expires = DateTime.Now.AddMinutes(20);
    Response.Cookies.Add(mycookie);

    DateTime now = DateTime.Now;
    Response.Write("Cookie Not found <br> Time diff : ");
    Response.Write((mycookie.Expires - now).TotalMinutes);
}
else
{
    DateTime now = DateTime.Now;
    Response.Write("Cookie found <br> Time diff : ");
    Response.Write((mycookie.Expires - now).TotalMinutes);
}

如您所见,我正在检查cookie是否存在。如果不存在,那么我创建一个cookie并打印时差,这工作正常并按预期打印20(当我第一次运行时)。如果cookie存在,我打印时间差而不创建cookie,这是行不通的(当我第二次运行它或页面刷新时),这会打印一些负的长号。

3 个答案:

答案 0 :(得分:2)

您可以直接从另一个时间减去一次。 .TotalMinutes会在几分钟内给你差异。所以你可以像这样使用:

DateTime end = cookie.Expires;
DateTime start = DateTime.Now;
Response.Write((end-start).TotalMinutes);

答案 1 :(得分:0)

编辑: Expired属性仅供浏览器使用,以了解何时删除cookie。它不会被发送回服务器,因此您无法读取它。如果要实现此目的,则应将时间戳存储在cookie值中,并在发送回来时对其进行解析。请参阅此处有关过期的说明 - https://msdn.microsoft.com/en-us/library/ms178194.aspx

虽然您没有指定实际问题是什么,但我假设问题结果不正确。很可能时区存在问题。根据文档(https://msdn.microsoft.com/en-us/library/system.net.cookie.expires(v=vs.110).aspx

,cookie expires属性可以是本地或UTC时间

所以你需要这样的东西

DateTime end = cookie.Expires;

//needed because ToUniversalTime method assumes Unspecified kind means Local
//while Expires assumes Unspecified means Utc
if(end.Kind == DateTimeKind.Unspecified) 
{
    end = DateTime.SpecifyKind(end, DateTimeKind.Utc);
}

end = end.ToUniversalTime();

DateTime start = DateTime.UtcNow;
Response.Write((end - start).TotalMinutes);

答案 2 :(得分:0)

看看这段代码,这将提供你需要的东西

python run_tests.py

您的代码中存在两个错误。

  1. 您无法从浏览器中读取到期日期,因此您必须将其作为属性添加到Cookie中,然后才能阅读它(请查看HttpCookie mycookie = Request.Cookies.Get("hello"); if (mycookie == null) { mycookie = new HttpCookie("hello"); mycookie["message"] = "Hello World"; mycookie["ExpirationDate"] = DateTime.Now.AddMinutes(20).ToString(); mycookie.Expires = DateTime.Now.AddMinutes(20); Response.Cookies.Add(mycookie); DateTime now = DateTime.Now; Response.Write("Cookie Not found <br> Time diff : "); Response.Write((mycookie.Expires - now).TotalMinutes); } else { DateTime end = Convert.ToDateTime(mycookie["ExpirationDate"]); DateTime now = DateTime.Now; Response.Write("Cookie found <br> Time diff : "); Response.Write((end-now).Minutes); } 部分)。

  2. 您正试图获得else(大数字的原因)。问题是,当你得到当前时间((end-now).TotalMinutes)时,它也会给出秒和毫秒。因此,当您尝试减去时,您将无法在几分钟内获得整数。因此请使用DateTime.Now

  3. 要了解更多信息,请尝试使用此代码。

    (end-now).Minutes