2013-03-20 19 views
19

私はしばらくの間、古いバージョンのJSON.Net(4.0r4)を使用していました。&が最新のもの(4.5r11)に更新されました。 00::JSON.NETのデフォルトのDateTimeシリアル化が変更されたのはなぜですか?

2013-03-20T09:00.119Z

を今している:私は、日付は次のようにフォーマットするために使用されることに気付きました

2013-03-20T09: 00:00.119

最後にZがありません。ウィキペディアによると:時間がUTCである

場合は、スペース

せずに、直接時間後にZを追加し、私はこれを変換する方法を持っているとして、これは私のJavaScriptコードの多くを壊れていますDateTimeオブジェクト&には、Zが必要です。私はこの機能を変更して修正することができます。&私は をDateTimeZoneHandlingに設定してDateTimeZoneHandling.Utcに設定できますが、これは複数のプロジェクトで多くのC#コードを変更する必要があることを意味します。

なぜこれが変更されたのか不思議です。

おかげで...

+0

代わりにhttp://json.codeplex.com/discussionsで質問する価値があります。 –

+2

それは奇妙です。それは[自分のドキュメント](http://james.newtonking.com/projects/json/help/index.html?topic=html/DatesInJSON.htm)によると、4.5より前の動作はまったく異なる形式であり、 4.5動作はISO8601( 'Z'を含む)です。セットアップでカスタムコンバータを使用していますか? –

+1

これは私のプロジェクトで問題になりました。なぜ彼らはISO8601規格を無視するのだろうか? – Toolkit

答えて

6

何ブラウザ(複数可)あなたはこの中で起こる見ていますか?実際に対処している問題はJavascriptの解析であるため、私の経験上、問題は実際にはミリ秒の丸めであり、Zの存在ではありません。

IE9でこれを試してみてください:すべての日付が細かい解析ほとんどのブラウザでhttp://jsfiddle.net/b9chris/HaBP8/

'2013-06-13T20:43:55.6', 
'2013-06-13T20:43:55.61', 
'2013-06-13T20:43:55.61Z', 
'2013-06-13T20:43:55.611', 
'2013-06-13T20:43:55.611Z' 

。 IE9はミリ秒数の3桁を必要とするため、IE9では最初の3つが失敗します。 2番目の2つはZの有無にかかわらず成功します。重要なのは3ミリ秒です。Zは.NETと同じようにJavascriptにDateTimeKindが含まれていないためZを含まないため、ZまたはNoはJavascriptが日付を内部化する方法とは関係ありません。時間に応じてミリ秒の数字が時々1または2になることがあるので、タイムスタンプを渡すと、ランダムに見える失敗が発生します。

I've reported this as a bug on the Json.Net Codeplex page;それはバグのコメントのメンテナーによって解雇され、閉鎖されました。オープンソースへあなたはこの回答のコードを使用して、このバグを回避することができます

https://stackoverflow.com/a/15939945/176877

明確にするために、それはDateTimeKindのためにそれなしで放出する場合、Zの欠如はJSON.Netの一部に誤りがあります。UTCが、それは、より一般的に無効なISO-8601日付ではありません - 何のZは、暗黙のうちに現地時間を意味します。no UTC関係情報は、時間の表現で指定されていない場合、時間がに仮定され

http://en.wikipedia.org/wiki/ISO_8601#Times

現地時間である。

上記のように、JavaScriptの構文解析はZについて気にしないので、あなたの目的のためには関係ありません。

また、実際にはUTCをJSON.Netに渡してこの問題を引き起こしていない可能性があります。 C#のDateTimeオブジェクトは種類がLocal, Unspecified, or UTCです。 UTCでないDateTimesが実際はUTCであると仮定することは公正ではありません。タイムゾーン情報なしでそれを渡すのが最も安全です。 .Net DateTime構造体はタイムゾーンでパンチするので、JSON.NetはデフォルトのDateTimes(DateTimeKind.Unspecified)をLocalとして出力し、.Net TimeZone libraryとの統合はできません。

+0

DateTime値がローカルであると仮定している人にとっては、それをカットするつもりはないが、常にDateTimeOffset型がある。 – Shaun

3

あなたが明示的にDateTime値は末尾に "Z" した後DateTimeZoneHandlingプロパティ

//serializer fix 
     config.Formatters.Clear(); 
     config.Formatters.Add(new JsonMediaTypeFormatter() 
     { 
      SerializerSettings = new JsonSerializerSettings() { 
       ContractResolver=new CamelCasePropertyNamesContractResolver(), 
       DateTimeZoneHandling = DateTimeZoneHandling.Utc}, 

     }); 

を設定する必要があり、サーバー上のUTCデータがある場合:2017-05-11T00:35:20.8242381 Zを

関連する問題