2016-03-29 16 views
2

Bir DateTime gömülü .net JavaScriptSerializer kullanarak serileştirir ve seri hale getirirseniz, UTC + öğesinde iseniz iki farklı tarih elde edersiniz!. Net DateTime Serialization Deserialization hata

Örnek sen serileştirilemezse tarihini alınca

JavaScriptSerializer myJson = new JavaScriptSerializer(); 

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00 
strSerialized = myJson.Serialize(myDate); 

//DO WHAT YOU NEED WITH IT... 

DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized); 
Label1.Text=myDateDes.ToString();//it gives you 2016-03-29 14:12:00 ! WRONG! IT's in UTC+0 ! Has 2 HOURS less !!! 

Yani, varsayılan olarak UTC + 0 size değer vereceğiz (ben şimdi gibi UTC + 2 içindedir varsayalım) ...! !

JavaScriptSerializer UTC DateTime issues'dan farklıdır, çünkü bu makalede farklı tarih verileri veri türlerinin serileştirilmesindeki fark açıklanmaktadır ve sorunu çözmeyen bir çözüm (.UtcDateTime) sağlar. Aslında .utcDateTime ile seri hale getirilmiş bir DateTime ile seri hale getirilmeye çalışılırken her zaman yanlış UTC + 0 tarihi verilir ...

+1

Ben gues Bunun yerine bir DateTimeOffset nesnesini serileştirmek/serileştirmek istiyorsunuz. –

+0

Benim durumumda DateTime'a ihtiyacım vardı ... DateTimeOffset bana 29/3/2016 17:00:23 +02: 00 gibi utc ofsetini veriyor ama deserialization'dan sonra utc + 0'a dönüyor (29/03/2016 15:00:23 +00: 00). Bu, arkasında ne olduğunu anlamak için yararlıdır, ama benim durumumda, tam olarak ne serileştirdiğimi tam olarak seri hale getirmeye ihtiyacım vardı, değiştirilmiş bir utc versiyonu değil ... – BitQuestions

+1

Bu aslında .net'de bilinen bir hata olduğuna inanıyorum serileştirici. – Jeff

cevap

3

İki farklı çözüm vardır: ya serileştirdiğinizde ToLocalTime() öğesini kullanın VEYA Newtonsoft.Json'u kullanın.

Yani ilk durumda "sabit" Aynı kod, olmalıdır: Bir "kullanarak Newtonsoft sonra, Nuget yükleyebilirsiniz eklemek için Newtonsoft.Json (önce ihtiyaç kullanarak Aksi

JavaScriptSerializer myJson = new JavaScriptSerializer(); 

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00 
strSerialized = myJson.Serialize(myDate); 

//DO WHAT YOU NEED WITH IT... 

DateTime myDateDes = myJson.Deserialize<DateTime>(strSerialized).ToLocalTime(); 

Label1.Text=myDateDes.ToString();//it gives you 2016-03-29 16:12:00 !!! CORRECT ! 

. üstündeki Json"), bu gibi kullanmak ve:

DateTime myDate = DateTime.Now; //suppose 2016-03-29 16:12:00 
strSerialized = JsonConvert.SerializeObject(myDate); 

//DO WHAT YOU NEED WITH IT... 

DateTime myDateDes = JsonConvert.DeserializeObject<DateTime>(strSerialized); 
Label1.Text=myDateDes.ToString();//NO need to convert to LocalTime... it already gives you 2016-03-29 16:12:00 !!! CORRECT ! 

Bunun başkası için yararlı olacağını umuyoruz ... Ben çok googled ve yalnızca Microsoft serileştiriciye ile olur bu sorun hakkında hiçbir şey bulunamadı ..