JavaScriptSerializer从日期减去一天

Zah*_*med 20 datetime javascriptserializer c#-4.0

我正在使用JavaScriptSerializer序列化DateTime,但是当我反序列化它显示从序列化日期开始减少一天:

这是测试:

  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);
Run Code Online (Sandbox Code Playgroud)

首先我认为它是因为javascript日期时间格式,但我知道javascript月份是零索引0=January,但我比原始日期少一天.

Bra*_*tie 20

它不会随意丢失一天,它会转换为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);
Run Code Online (Sandbox Code Playgroud)

但是,请尝试以下方法:

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

您现在可以将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!
Run Code Online (Sandbox Code Playgroud)

  • 这是[记录的行为](http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2),虽然非常不清楚. (2认同)

mis*_*hka 5

我遇到了同样的问题并通过使用解决了它

Newtonsoft.Json.JsonConvert.SerializeObject()
Run Code Online (Sandbox Code Playgroud)

代替

new System.Web.Script.Serialization.JavaScriptSerializer().Serialize().
Run Code Online (Sandbox Code Playgroud)

后一个调用将您的 DateTime 存储为某个随机时区(GMT+0 似乎是硬编码的)。