serialize script objects new for example array c#-4.0 datetime javascriptserializer

c# 4.0 - objects - JavaScriptSerializer resta un día de la fecha



using for javascriptserializer (3)

Al deserializar JavaScriptSerializer darme salida en UTC (Universal Time) que debido al cambio en las horas cambia la fecha. Como Brad Christie sugirió cambiar DateTime a UTC, puede resolver los problemas.

Pero en realidad no hay necesidad de cambiar el:

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

Como ya lo está tomando como Tiempo Universal. Así que simplemente convierto la salida de deserialize a LocalTime :

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

Se solucionó el problema.

Estoy usando JavaScriptSerializer para serializar DateTime, pero cuando lo deserializo, muestro un día menos desde la fecha en que se serializa:

Aquí está la prueba:

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

en primer lugar, pensé que era debido al formato de fecha y hora de javascript pero, como sé, para javascript, el mes es cero índice 0=January , pero recibo un día menos que la fecha original.


No está perdiendo un día arbitrariamente, se está convirtiendo en una fecha UTC (o debo decir que usa la fecha en un formato de fecha UTC), por lo que, cuando no esté serializado, ya no estará dentro de su zona horaria personal. Básicamente está realizando:

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

Sin embargo, intente lo siguiente:

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

Ahora tendrá la hora UTC de regreso a su hora local (con la zona horaria aplicada).

Para pasar su examen:

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!


Tuve el mismo problema y lo resolví usando

Newtonsoft.Json.JsonConvert.SerializeObject()

en lugar de

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

La última llamada almacena su DateTime convertida en una zona horaria aleatoria (GMT + 0 parece estar codificado).