2016-04-01 49 views
1

Ben bir ASP .NET proje üzerinde çalışıyorum ve şu anda ben depolamak ve çerezlere DateTime almak için bu kodu kullanıyorum:DateTime'ı çerezlere depolamanın en iyi yolu nedir?

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

Ve View İyileşiyorum için böyle bir model değerleri Razor kullanıyorum:

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

Ben yerel olarak çalıştırın zaman iyi çalışıyor, ama üretime yüklerken çerezinden DateTime kurtarırken, tarih bir günde değiştirilir. Örneğin, 3/25/2016 ila 4/1/2016 tarihleri ​​arasında bir tarih aralığı seçtim, sonra başka bir sayfaya gittim ve bu sayfaya geri döndüğümde, sayfa 3/24/2016'dan bir tarih aralığı gösterdi Bir gün içinde 3/31/2016, azaldı.

Burada neyi yanlış yaptığımı biliyor musunuz, neden bu üretimde (sunucu tarihiyle ilgili bir şey varsayalım) ve son olarak çerezde bir DateTime'ı saklamak ve almak için en iyi yol nedir?

+0

Üretim sunucusu nerede bulunur? –

+0

Emin değilim ama ingiltere'de olduğuna inanıyorum. Konuşmak için Octopus kullanıyorum. – Marcello

+0

IP'yi kontrol ettim ve Malta'da bulunuyor. – Marcello

cevap

2

yardımcı

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

Hope/her zaman düşünmelisiniz string gibi zaman Zaman dilimleri. Sana DateTimeOffset yerine DateTime kullanımına öneriyoruz:

var now = DateTimeOffset.Now; 
var asString = now.ToString(CultureInfo.InvariantCulture); 
var asDatetimeOffset = DateTimeOffset.Parse(asString, CultureInfo.InvariantCulture); 

dize şöyle görünür:. 04/01/2016 22:01:09 +02:00

(Doğru onun 'Yerel' zamanı hesaplamak için müşterinin zaman dilimini bilmemiz gerekir sizin örnekte, sunucu kendi zamanını kullanır.)

DateTime.Parse(cookie["From"]); sonucu DateTimeKind.Unspecified olarak ayarlanmıştır. Başka herhangi bir işlem (AddDays gibi) sistemin saat dilimine bağlıdır.

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

Not: DateTime.ToShortDateString iyi bir seçim değil, şimdiki kültürün DateTimeFormatInfo tarafından tanımlanmış olduğundan

Sana kültür belirtmek ve beklemek DateTimeKind ayrıştırıcı söylemeliyiz nesne.

+0

Sorun, saat dilimlerle ilgiliydi. Bunu farklı bir şekilde çözdüm, ama bu cevap gerçekten yardımcı oldu. Teşekkür ederim! – Marcello

4

Sen Keneler

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

tarihini saklamak ve bu gibi kurtarabilirsiniz: Tarih saklarken bu size

İlgili konular