Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将日期时间存储到cookies中的最佳方法是什么?_C#_Asp.net_Asp.net Mvc_Datetime_Cookies - Fatal编程技术网

C# 将日期时间存储到cookies中的最佳方法是什么?

C# 将日期时间存储到cookies中的最佳方法是什么?,c#,asp.net,asp.net-mvc,datetime,cookies,C#,Asp.net,Asp.net Mvc,Datetime,Cookies,我正在从事一个ASP.NET项目,目前我正在使用以下代码在Cookie上存储和检索DateTime: HttpCookie cookie = new HttpCookie("myCookie"); if (Request.Cookies["myCookie"] != null) { cookie = Request.Cookies["myCookie"]; } else { cookie["From"] = DateTime.Now.AddDays(-7).ToShortDate

我正在从事一个ASP.NET项目,目前我正在使用以下代码在Cookie上存储和检索DateTime:

HttpCookie cookie = new HttpCookie("myCookie");
if (Request.Cookies["myCookie"] != null)
{
    cookie = Request.Cookies["myCookie"];
}
else
{
    cookie["From"] = DateTime.Now.AddDays(-7).ToShortDateString();
    cookie["To"] = DateTime.Now.ToShortDateString();
    Response.Cookies.Add(cookie);
}
model.FromDate = DateTime.Parse(cookie["From"]);
model.ToDate = DateTime.Parse(cookie["To"]);
在我看来,我正在使用Razor恢复模型值,如下所示:

<input type="text" id="from" value="@Model.FromDate.ToShortDateString()" readonly="readonly" />
<input type="text" id="to" value="@Model.ToDate.ToShortDateString()" readonly="readonly" />
model.FromDate = new DateTime(Convert.ToInt64(cookie["From"]));
model.ToDate = new DateTime(Convert.ToInt64(cookie["To"]));

当我在本地运行它时,它工作得很好,但是当我上传到生产时,当从cookie恢复日期时间时,日期在一天内就改变了。例如,我选择了一个从2016年3月25日到2016年4月1日的日期范围,然后我转到了另一个页面,当我回到这个页面时,该页面显示了一个从2016年3月24日到2016年3月31日的日期范围,在一天内减少了


你知道我在这里做错了什么吗?为什么这只是在生产中发生的(我想是与服务器日期有关的事情),最后,在cookie上存储和检索日期时间的最佳方法是什么?

你可以用记号存储日期

cookie["From"] = DateTime.Now.AddDays(-7).Ticks.ToString();
cookie["To"] = DateTime.Now.Ticks.ToString();
然后像这样恢复:

<input type="text" id="from" value="@Model.FromDate.ToShortDateString()" readonly="readonly" />
<input type="text" id="to" value="@Model.ToDate.ToShortDateString()" readonly="readonly" />
model.FromDate = new DateTime(Convert.ToInt64(cookie["From"]));
model.ToDate = new DateTime(Convert.ToInt64(cookie["To"]));

<>希望这有助于您

< P>当存储日期/时间为<代码>字符串< /代码>时,您应该始终考虑<强>时区。< /强>我建议您使用<代码> DATEMEMPLOOS而不是<代码> DATETIME>/代码>:

var now = DateTimeOffset.Now;
var asString = now.ToString(CultureInfo.InvariantCulture);
var asDatetimeOffset = DateTimeOffset.Parse(asString, CultureInfo.InvariantCulture);
字符串如下所示:
04/01/2016 22:01:09+02:00

(您需要知道客户端的时区才能正确计算其“本地”时间。在您的示例中,服务器使用自己的时间。)

DateTime.Parse(cookie[“From”])的结果设置为
DateTimeKind.Unspecified
。任何进一步的操作(如AddDays)都取决于系统的时区

我认为您应该指定区域性,并告诉解析器应该使用哪个
DateTimeKind

model.FromDate = DateTime.Parse(cookie["From"], CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal);
model.ToDate = DateTime.Parse(cookie["To"], CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal);

注意:DateTime.ToSortDateString不是一个好选择,因为它是由当前区域性的DateTimeFormatInfo对象定义的。

生产服务器位于哪里?我不确定,但我相信它位于英国。我使用章鱼来部署。我检查了IP,它位于马耳他。你可能想考虑在UTC(DATETIM.UTcNW)中做任何事情。如果你知道用户的时区,就可以在时区周围使用.Net函数。很久以前,我写过关于在不同时区跨客户端管理日期时间的文章,看看是否有帮助……问题与时区有关。我用另一种方式解决了这个问题,但这个答案真的很有帮助。非常感谢。