Pregunta sobre json.net – Evita que Json.NET 4.5 agregue el desplazamiento de la zona horaria cuando se utiliza MicrosoftDateFormat

20

Corto de una costumbreDateTimeConverterBase implementación, hay alguna manera de mantener Json.NET 4.5+, cuando está configurado para usarDateFormatHandling.MicrosoftDateFormat, de añadir un desplazamiento de zona horaria para cualquier no UTCDateTime ¿está dado?

<code>"\/Date(1333645844276-0600)\/"
</code>
Detalles

Estoy cambiando un proyecto de API de usar el .NET incorporadoJavaScriptSerializer a usar Json.NET para generar JSON. En Json.NET, para una UTCDateTime, la serialización de fecha y hora predeterminada fue similar a la versión .NET:

<code>"\/Date(1333645844276)\/"
</code>

Para no-UTC, a diferencia deJavaScriptSerializer, Json.NET agrega una zona horaria compensada a los resultados (-6 para mi área, esta época del año):

<code>"\/Date(1333645844276-0600)\/"
</code>

Aquí está el código que estoy usando para cambiar Json.NET 4.5+ al\/Date(...)\/ formato (llamadoMicrosoftDateFormat):

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
</code>

La solución parecía ser tan simple como decirle a Json.NET que use unDateTimeZoneHandling ajuste. He intentado cada ajuste paraDateTimeZoneHandling (Local, Utc, UnspecifiedyRoundtripKind) y todos mantienen el "-0600" en la salida. De hecho, todos producen resultados idénticos para un no-UTCDateTime.

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings() {
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
"\/Date(1333647855743-0600)\/"
</code>
Advertencia

Idealmente, ya tendría todos mis tiempos en UTC. Ciertamente planeo hacerlo con la próxima versión de esta API. Dado que se trata de una API en vivo, no vale la pena arriesgar un cambio de salida hasta que se lance una nueva versión. No parece ser un problema para la mayoría de los sistemas de análisis JSON, pero no puedo arriesgarme al cambio ya que el estándar JSON no dice nada oficialmente sobre la serialización de la fecha.

Yo también tengo este problema, exactamente el mismo problema. kerzek

Tu respuesta

2   la respuesta
11

ver más abajo. Mi ensamblaje JSON.NET dice que es la versión "4.5.0.0".

<code>JsonSerializerSettings customJsonSettings = new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
string result = JsonConvert.SerializeObject(DateTime.Now, customJsonSettings);
Console.WriteLine(result); // "\/Date(1344249339881)\/"
</code>

Tal vez fue un error que se ha solucionado?

Creando explícitamente una fecha:

<code>var x = new { thedate = new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Local) };

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc
    }));
// {"thedate":"\/Date(1234652400000)\/"}

Console.WriteLine(JsonConvert.SerializeObject(x,
    new JsonSerializerSettings() {
        DateFormatHandling = DateFormatHandling.MicrosoftDateFormat,
        DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local
    }));
// {"thedate":"\/Date(1234652400000+0100)\/"}
</code>
Confirmado. Tuve exactamente el mismo problema. Tenía JSON.NET 4.5.7, actualizado a 4.5.8 y ahora deserializa datetime correctamente. Chad W
3

ia deDateTime para la última versión 9.0.0:

<code>var time = DateTime.Now;

Console.WriteLine(JsonConvert.SerializeObject(time, new JsonSerializerSettings()
{
    DateFormatHandling = DateFormatHandling.IsoDateFormat,
    DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Unspecified
}));

//"{"thedate": "2016-12-15T09:20:00.9375403"};
</code>
no debería haber sido tan difícil encontrar esta respuesta porque los demás no eliminan la información de compensación. viggity

Preguntas relacionadas