将DateTime存储到cookie中的最佳方法是什么?

时间:2016-04-01 19:30:38

标签: 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).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" />

当我在本地运行它时工作正常,但是当我上传到生产时,从cookie恢复DateTime时,日期会在一天内更改。例如,我选择了从2016年3月25日到2016年4月1日的日期范围,然后我又转到了另一页,当我回到此页面时,页面显示的日期范围是2016年3月24日到2016年3月31日,在一天内减少。

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

2 个答案:

答案 0 :(得分:6)

您可以将日期存储在Ticks

- (BOOL)textField:(UITextField *)fieldPhone shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSString* totalString = [NSString stringWithFormat:@"%@%@",self.fieldPhone.text,string];

    // if it's the phone number textfield format it.
    if(fieldPhone.tag==102 ) {
        if (range.length == 1) {
            // Delete button was hit.. so tell the method to delete the last char.
            fieldPhone.text = [self formatPhoneNumber:totalString deleteLastChar:YES];
        } else {
            fieldPhone.text = [self formatPhoneNumber:totalString deleteLastChar:NO ];
        }
        return false;
    }

    return YES; 
}

并像这样恢复:

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

希望这有助于你

答案 1 :(得分:3)

将日期/时间存储为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对象定义的。