2016-04-01 111 views
1

我工作的一个ASP .NET项目,目前我正在使用此代码来存储和检索的cookie日期时间:将DateTime存储到Cookie中的最佳方式是什么?

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"]); 

在我看来,我使用剃刀恢复这样的模型值:

<input type="text" id="from" value="@Model.FromDate.ToShortDateString()" readonly="readonly" /> 
<input type="text" id="to" value="@Model.ToDate.ToShortDateString()" readonly="readonly" /> 

它工作正常,当我在本地运行,但是当我上传到生产,回收来自cookie中的日期时间时,日期在一天内改变。例如,我选择了2016年3月25日至2016年4月1日的日期范围,然后我转到了另一个页面,当我回到此页面时,页面显示的日期范围为3/24/2016到2016年3月31日,在一天内减少。

你知道我在做什么错在这里,为什么这只是在生产(我想是与服务器日期相关的东西),最后,什么是在cookie上存储和检索日期时间的最佳方式是什么?

+0

生产服务器在哪里? –

+0

我不确定,但我相信它位于英国。我正在使用八达通进行部署。 – Marcello

+0

我查了IP,它位于马耳他。 – Marcello

回答

2

当存储日期/时间string你应该总是考虑时区。我建议你使用的DateTimeOffset代替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.ToShortDateString是不是一个好的选择,因为它是由当前文化的的DateTimeFormatInfo定义目的。

+0

问题与时区有关。我用不同的方式解决了这个问题,但这个答案真的很有帮助。谢谢! – Marcello

4

您可以存储日期在蜱

cookie["From"] = DateTime.Now.AddDays(-7).Ticks.ToString(); 
cookie["To"] = DateTime.Now.Ticks.ToString(); 

和恢复这样的:

model.FromDate = new DateTime(Convert.ToInt64(cookie["From"])); 
model.ToDate = new DateTime(Convert.ToInt64(cookie["To"])); 

希望这有助于你

相关问题