NANCYFXは、UTC / ZULUを示すための末尾のzで日付をシリアル化していません

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

  •  21-12-2019
  •  | 
  •  

質問

データベースのすべての日付をUTCとして保存します。

APIから弊社に戻ったとき、それらは次の形式です。

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

しかしあなたが見ることができるように、日付は末尾のz(これはそれがUTC / Zuluである私たちの角度アプリケーションに示す)を持っていません。この

のように見えるはずです
"createdDate":"2014-07-30T18:34:45Z"
.

ブートストラップ

に次の設定があります。
JsonSettings.ISO8601DateFormat = true;
.

私の構成のどこで、UTC解析の目的のための末尾のZがあることを確認できますか?

役に立ちましたか?

解決

あなたはどのバージョンのNancyfxを使っていますか? v0.23.0以降では、JSonSerializerコードは "S"日付形式の代わりに "O"日付形式を使用するように変更されました。これにより、探している末尾のZがあります。 (UTC日時だけでのみ)

https://github.com/nancyfx/ナンシー/ブロブ/ v0.23.0 / SRC / NANCY / JSON / jsonserializer.cs 、行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 + ")\\/\"");
        }
    }
.

ご覧のとおり、ISO 8601の日付フォーマットを要求すると、2014-07-30T18:34:45フォーマットがエポックの数ではなく、シリアライズされている値がある場合は現地時間が想定されます。 DateTimeKind.Localに等しい種類。

だから私はあなたのための2つの提案を持っています:v0.22以前のv0.23へのアップグレード(v0.22は、シリアル化のためのTimeZone情報を含まない "S"日付形式を使用しました。日時値)。そして、シリアル化しているDateTimeオブジェクトが明示的にDateTimeKind.Utcに設定されていない場合は、必ずUtcを指定してください(デフォルトはUnspecifiedです.NancyFXはLocalと同等のものとして扱われます)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top