JavaScriptSerializer is subtracting one day from date

前端 未结 3 1819
天涯浪人
天涯浪人 2020-12-10 01:18

I am using JavaScriptSerializer for serializing DateTime, but when I deserialize it show one day less from the date it get serialize:

Here is test:

相关标签:
3条回答
  • 2020-12-10 01:56

    I had the same problem and solved it by using

    Newtonsoft.Json.JsonConvert.SerializeObject()
    

    instead of

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

    The latter call stores your DateTime converted to some random timezone (GMT+0 seems to be hardcoded).

    0 讨论(0)
  • 2020-12-10 02:10

    It's not losing a day arbitrarily, it's converting to a UTC date (or I should say using the date in a UTC date format) so when it's unserialized it you're no longer within your personal time zone. It's basically performing:

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

    However, try the following:

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

    You'll now have the UTC time back to your local time (with time zone applied).


    To Pass your test:

    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!
    
    0 讨论(0)
  • 2020-12-10 02:14

    On deserializing JavaScriptSerializer giving me output in UTC (Universal Time) which due to change in hours change the date. As Brad Christie suggested to change DateTime to UTC it can solve the problems.

    But actually there is no need to change the:

    DateTime startDate = new DateTime(2012, 1, 20).ToUniversalTime();
    

    as it is already taking it as Universal Time. So I just convert the output of deserialize to LocalTime:

     DateTime afterDeserialize= serializer.Deserialize<DateTime>(serializeDate);
     afterDeserialize.ToLocalTime();
    

    it solved the issue.

    0 讨论(0)
提交回复
热议问题