2013-05-22 3 views
11

私はこの質問が複数回にわたってハッシュされていることを知っています。そのハッシングについて多くの投稿を読んでいますが、まだ混乱しています。DateTime Json Return from WebAPIデフォルトシリアライザ

MVC4/WebAPIを使用して、私は単にDateTime.Nowとして作成されたdatetimeを持っています。 sessionRecordsSmallはその中のDateTimeのパブリックプロパティを持つ

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, new 
      { 
       data = sessionRecordSmalls, 
       count = sessionRecordSmalls.Count, 
       success = true 
      }); 

私のWebAPIのは、このようなリターンのデータです。

VSデバッガで日付を見ると、DateTimeにタイムゾーンが含まれていないため、タイムゾーンが表示されていないことを示しています。

私は、サーバーからダウンロードされるものを見たとき、私はJSON

2012-10-06T09で見る

{2012年10月6日午前9時45分00秒AM}:45:00

T0はタイムゾーン0を意味すると思いますが、それは100%ではありません。私のJavaScriptライブラリはそれをタイムゾーン0として解釈し、GMTとしてダウンロードされた実際の日付を表示します(私にとっては約9時間前)。

私の質問は、JSONは何ですか?それはタイムゾーンを含んでいますか?私はここで重要な一歩を欠いていますか?

答えて

12

Web APIとデフォルトのシリアライザを使用してJSONで受け入れる日付時刻2012-10-06T09:45:00は、the ISO 8601の形式です。

実際これはいわゆるCombined date and time representationsです。エキス:

時間..A単一ポイントが 完全な日付式、区切り文字として文字T、および有効 時間表現を連結することによって表現することができます。たとえば、「2007-04-05T14:30」...

この形式のタイムゾーン情報はありません。 Time zone designators抽出で述べたように:ISO 8601に

タイムゾーンはUTCとして、またはUTCからのオフセットとして、ローカル時刻として(不特定 位置)で表されます。時間表記でUTC の関連情報が指定されていない場合は、時刻は となります。

つまり、指定されたUTCからのオフセットがない場合、ローカルタイムとして扱われます。

UTC formatは終了時刻がUTCである場合

Zで拡張されるだろう、 スペースずに時間が経過した後、直接Zを追加します。 ZはゼロUTCオフセットのゾーン指定子です。 「09:30 UTC」 は「09:30Z」または「0930Z」と表されます。 「14:45:15 UTC」は は「14:45:15Z」または「144515Z」となります。

「Zulu」は「Z」のためのNATO発音アルファベット語であるため、UTC時間は「Zulu」時間とも呼ばれます。

だから、私たちは受け取る日時は、ISO 8601形式、心に留めておくjson.netでシリアライズする場合は、ローカルタイムゾーン(この2012-10-06T09:45:00Zような終わりがないZ

+3

例セット; }デフォルトではないはずですが、コンバージョンに期待しているものが得られますか? –

+0

正直に分かりませんが、このhttp://icanmakethiswork.blogspot.cz/2012/04/beg-steal-or-borrow-decent-javascript.htmlを読むことをお勧めします...私はUTCまた、いくつかのハッキングで –

35

として扱わであることDateTimeZoneHandlingと指定できます。 ; [JsonProperty(ItemConverterType = typeof演算(JavaScriptDateTimeConverter))] 公共のDateTime LOGDATE {得る:私は私は私の日時を飾るときに気づくWebApiConf.cs

var json = config.Formatters.JsonFormatter; 
json.SerializerSettings.DateTimeZoneHandling =Newtonsoft.Json.DateTimeZoneHandling.Local; 
+0

これは私の時間を節約するのに役立ちます。どうもありがとうございます –