20

DateTime のシリアル化に使用JavaScriptSerializerしていますが、逆シリアル化すると、シリアル化された日付から 1 日少なく表示されます。

ここにテストがあります:

  DateTime startDate=new DateTime(2012,1,20);//set the 20th of January
  JavaScriptSerializer  serializer=new JavaScriptSerializer();
  string serializeDate= serializer.Serialize(startDate);
  DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);//I get 19th of Jan
  Assert.Equals(startDate, afterDeserialize);

まず、javascript の datetime 形式が原因だと思いましたが、javascript Month is zero index について知っているように0=January、元の日付より 1 日少なくなります。

4

3 に答える 3

20

恣意的に1日を失うのではなく、UTC日付に変換しているため(または、UTC日付形式の日付を使用していると言うべきです)、シリアル化を解除すると、個人のタイムゾーン内になくなります。それは基本的に実行しています:

DateTime whateverDate = /* incoming date */;
long ticks = whateverDate.ToUniversalTime() // make UTC
  .Subtract(new DateTime(1970, 1, 1))       // subtract UNIX Epoch
  .TotalMilliseconds();                     // get milliseconds since then
// push in to the "\/Date(ticks)\/" format
String value = String.Format(@"\/Date({0})\/", ticks);

ただし、次のことを試してください。

// or you rely on it serializing, then bring it back to your own local time
// (apply the time zone).
afterDeserialize = afterDeserialize.ToLocalTime();

これで、UTC 時間がローカル時間に戻ります (タイム ゾーンが適用されます)。


テストに合格するには:

DateTime startDate              = new DateTime(2012,1,20);
JavaScriptSerializer serializer = new JavaScriptSerializer();
String serializeDate            = serializer.Serialize(startDate);
DateTime afterDeserialize       = serializer.Deserialize<DateTime>(serializeDate)
                                  .ToLocalTime(); // Note: this is added

Assert.Equals(startDate, afterDeserialize); // pass!
于 2013-02-21T13:30:45.147 に答える
4

私は同じ問題を抱えていて、それを使用して解決しました

Newtonsoft.Json.JsonConvert.SerializeObject()

それ以外の

new System.Web.Script.Serialization.JavaScriptSerializer().Serialize().

後者の呼び出しでは、DateTime がランダムなタイムゾーンに変換されて保存されます (GMT+0 はハードコードされているようです)。

于 2016-01-07T11:56:07.463 に答える