NancyFX não serialização de datas com um ponto à direita de Z para indicar UTC/Zulu

StackOverflow https://stackoverflow.com//questions/25044697

  •  21-12-2019
  •  | 
  •  

Pergunta

Nós armazenamos todas as nossas datas na nossa base de dados como UTC.

Quando eles são devolvidos para nós da API, eles estão no seguinte formato

"createdDate":"2014-07-30T18:34:45"

Mas como você pode ver, a data não tem o sinal de Z (que indica a nossa Angular aplicativo que é UTC / Zulu).Deve olhar como este

"createdDate":"2014-07-30T18:34:45Z"

Eu tenho a seguinte configuração no nosso Bootstrapper

JsonSettings.ISO8601DateFormat = true;

Onde na minha config posso garantir que não há um fim Z com a finalidade de UTC análise?

Foi útil?

Solução

Qual a versão do NancyFx você está usando?Porque em v0.23.0 ou mais tarde, o JsonSerializer código foi alterado para usar o "o" formato de data em vez do "s" do formato de data, que deve dar o sinal de Z que você está procurando.(Mas apenas em UTC datetimes.)

Esta é a confirmação de que fez essa alteração. Observe como DateTimeKind.Unspecified as datas são tratados como local;que pode ser uma possível causa de seu problema, se você não está explicitamente criar seu DateTime objetos como DateTimeKind.Utc.

Abaixo está a NancyFx código que serializa os valores de DateTime, como olha, como de v0.23.0 (após consolidação).A partir de https://github.com/NancyFx/Nancy/blob/v0.23.0/src/Nancy/Json/JsonSerializer.cs, linhas 480-518:

    void WriteValue (StringBuilder output, DateTime value)
    {
        if (this.iso8601DateFormat)
        {
            if (value.Kind == DateTimeKind.Unspecified)
            {
                // To avoid confusion, treat "Unspecified" datetimes as Local -- just like the WCF datetime format does as well.
                value = new DateTime(value.Ticks, DateTimeKind.Local);
            }
            StringBuilderExtensions.AppendCount(output, maxJsonLength, string.Concat("\"", value.ToString("o", CultureInfo.InvariantCulture), "\""));
        }
        else
        {
            DateTime time = value.ToUniversalTime();

            string suffix = "";
            if (value.Kind != DateTimeKind.Utc)
            {
                TimeSpan localTZOffset;
                if (value >= time)
                {
                    localTZOffset = value - time;
                    suffix = "+";
                }
                else
                {
                    localTZOffset = time - value;
                    suffix = "-";
                }
                suffix += localTZOffset.ToString("hhmm");
            }

            if (time < MinimumJavaScriptDate)
                time = MinimumJavaScriptDate;

            long ticks = (time.Ticks - InitialJavaScriptDateTicks)/(long)10000;
            StringBuilderExtensions.AppendCount(output, maxJsonLength, "\"\\/Date(" + ticks + suffix + ")\\/\"");
        }
    }

Como você pode ver, solicitando formato de data ISO 8601 você irá obter o 2014-07-30T18:34:45 formato, ao invés de incluir o número de milissegundos desde a época, mas ele vai assumir locais vezes, se o valor a ser serializado tem um Tipo igual a DateTimeKind.Local.

Então, eu tenho duas sugestões para você:atualização para v0.23 de NancyFx se você ainda está em v0.22 ou anterior (v0.22 usou o "s" formato de data, que não incluem informações de fuso horário, para serialização de valores de DateTime).E se o DateTime objetos que você está serialização não são explicitamente definidas para DateTimeKind.Utc, e , em seguida, certifique-se de que você especificar Utc (já que o padrão é Unspecified, que NancyFx trata como equivalente a Local).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top