Pergunta sobre json.net – Evite que o Json.NET 4.5 adicione o deslocamento do fuso horário ao usar o MicrosoftDateFormat

20

Curta de um costumeDateTimeConverterBase implementação, existe alguma maneira de manter o Json.NET 4.5+, quando configurado para usarDateFormatHandling.MicrosoftDateFormat, de acrescentar um deslocamento de fuso horário para qualquer não-UTCDateTime é dado?

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

Estou mudando um projeto de API de usar o .NET embutidoJavaScriptSerializer para usar o Json.NET para gerar JSON. No Json.NET, para um UTCDateTime, a serialização de data e hora padrão era semelhante à versão .NET:

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

Para não-UTC, ao contrárioJavaScriptSerializer, Json.NET acrescenta um deslocamento de fuso horário para os resultados (-6 para minha área, nesta época do ano):

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

Aqui está o código que estou usando para mudar o Json.NET 4.5+ de volta para o\/Date(...)\/ formato (chamadoMicrosoftDateFormat):

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

A solução parecia ser tão simples quanto dizer ao Json.NET para usar umDateTimeZoneHandling configuração. Eu tentei todas as configurações paraDateTimeZoneHandling (Local, Utc, UnspecifiedeRoundtripKind) e todos eles mantêm o "-0600" na saída. Na verdade, todos eles produzem resultados idênticos para um não-UTCDateTime.

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

Idealmente, eu já teria todos os meus horários na UTC. Eu certamente planejo fazer isso com a próxima versão desta API. Como esta é uma API ao vivo, não vale a pena arriscar uma alteração de saída até que uma nova versão seja lançada. Não parece ser um problema para a maioria dos sistemas de análise JSON, mas não posso arriscar a mudança, já que o padrão JSON não diz oficialmente nada sobre serialização de datas.

Eu tenho esse problema também, exatamente o mesmo problema. kerzek

Sua resposta

2   a resposta
3

Eu encontrei uma solução para remover o fuso horário deDateTime para a versão mais recente 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>
Não deveria ter sido tão difícil encontrar essa resposta, porque os outros não retiram as informações de offset. viggity
11

veja abaixo. Meu assembly JSON.NET diz que é a versão "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>

Talvez tenha sido um bug que foi corrigido?

Criando explicitamente uma data:

<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. Eu tive o mesmo problema. Tinha JSON.NET 4.5.7, atualizado para 4.5.8 e agora desserializa datetime corretamente. Chad W

Perguntas relacionadas