C# asp c中当前时间和cookie补偿时间之间的时间差#

C# asp c中当前时间和cookie补偿时间之间的时间差#,c#,asp.net,cookies,time,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

下面是我用来检查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);
}
HttpCookie mycokie=Request.Cookies.Get(“hello”);
如果(mycokie==null)
{
mycokie=newhttpcookie(“你好”);
mycokie.Value=“你好世界”;
mycookie.Expires=DateTime.Now.AddMinutes(20);
响应.Cookies.添加(mycokie);
DateTime now=DateTime.now;
响应。写入(“未找到Cookie
时间差:”; Write((mycokie.Expires-now).TotalMinutes); } 其他的 { DateTime now=DateTime.now; 响应。写入(“找到Cookie
时间差:”; Write((mycokie.Expires-now).TotalMinutes); }

如你所见,我正在检查cookie是否存在。如果不存在,那么我创建一个cookie并打印时间差,这可以正常工作并按预期打印
20
(当我第一次运行它时)。如果存在cookie,我打印时差而不创建cookie,这不起作用(当我再次运行此功能或页面刷新时),这会打印一些负数长数值。

您可以直接从一个时间减去另一个时间。我会在几分钟内给你区别。所以你可以这样使用:

DateTime end = cookie.Expires;
DateTime start = DateTime.Now;
Response.Write((end-start).TotalMinutes);
编辑: Expired属性仅由浏览器用于知道何时删除cookie。它不会发送回服务器,因此您无法读取它。如果要实现这一点,应该将时间戳存储在cookie值中,并在发送回cookie值时对其进行解析。请参阅此处关于过期的注释-

虽然你没有具体说明实际的问题是什么,但我假设问题是错误的结果。很可能是时区的问题。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);

看看这段代码,这将提供您所需要的

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);
}

您的结果出乎意料。事实上,这是我正在处理的一个大项目的一部分,我所需要的只是在用户打开浏览器时打印剩余时间,只需一次。对不起,DateTimeKind.uspecifiedy您的更新答案指出了时区问题。尝试使用UTC时间,如我的答案中所示。它不起作用,请看我已更改的问题,添加了更多信息停止使用DateTime.Now。在向用户显示之前,仅使用Utc和convert(在这种情况下,您不向用户显示,因此不需要转换)。当我说“停止使用DateTime.Now”时,我的意思是在任何项目中。@down投票者:请让我知道投票失败的原因?
DateTime end = DateTime.Now.AddSeconds(100);
DateTime now = DateTime.Now;
Response.Write("TotalMinutes : " + (end - now).TotalMinutes);
Response.Write("<br>Minutes : " + (end - now).Minutes);