2016-04-22 6 views
2

JSONのオフセットを無効に自動UTCはC#の - 私は、アプリケーションから取得日付JSON

"Date":"2016-04-22T00:00:00.000+0000" 

のような形式で日付フィールドを持っており、それはRestSharpによって直列化復元取得すると、日付が

"04/22/2016 03:00:00" 
に等しくなります

簡単な調査の後、私はRestSharpが解析日にUTCオフセットを自動的に適用することを理解しました。しかし、私の場合、私は正直にJSONに格納されているものを取得する必要があります。

RestSharpがJSONの日付フィールドにUTCオフセットを自動的に適用しないようにする方法はありますか?事前に

おかげ

+0

これはちょうど日付のローカル表現です。日付は同じです。 –

+0

UTCの日付 "04/22/2016 03:00:00"を取得した場合は、正しいバージョンに戻ってしまうでしょう – RvdK

+1

UTCの日付が自動的に渡されるのではなく、* + 0000 *の部分のID日付がUTC – bit

答えて

0

RestSharp可能性が高いのDateTime型に文字列を解析するための.NETのDateTimeメソッドを使用します。 DateTime.Parseメソッドは、入力文字列をコントロールパネルの地域および言語オプションから読み取ったタイムゾーンに変換します。そのようなことが起こらないようにするには、Parse関数に別のCulture設定(たとえばInvariantCulture)を指定する必要があります。 RestSharpコードを制御できない場合は、RestSharpメソッドを呼び出す前にスレッドカルチャを設定し、System.Threading.Thread.CurrentThread.CurrentCultureを使用します。 RestSharpが別のスレッドで実行されている場合、これは機能しません。その場合は、ローカルマシンのタイムゾーンの違いを否定する独自のDateTime変換を実行して、入力文字列を変換することができます。その後、適切な文字列形式に変換してRestSharpの入力として使用することができます。

0

UTC JSON文字列DateTime"2016-04-22T00:00:00.000+0000"がローカルDateTimeオブジェクト"04/22/2016 03:00:00"に変換されるようです。

DateTimeオブジェクトごとにDateTimeKindを指定してLocalと入力してから、UTCに変換して戻すことです。 thisを参照してください。

より良い方法は、Json.Netをシリアル化に使用することです。私はこれを好きに使っています:

private class MyWrappedRestClient : RestClient 
{ 
    public MyWrappedRestClient(string baseUrl) : base(baseUrl) { } 

    private IRestResponse<T> Deserialize<T>(IRestRequest request, IRestResponse rawResponse) 
    { 
     request.OnBeforeDeserialization(rawResponse); 
     var restResponse = (IRestResponse<T>)new RestResponse<T>(); 
     try 
     { 
      restResponse = rawResponse.ToAsyncResponse<T>(); 
      restResponse.Request = request; 
      if (restResponse.ErrorException == null) 
      { 
       restResponse.Data = JsonConvert.DeserializeObject<T>(restResponse.Content); 
      } 
     } 
     catch (Exception ex) 
     { 
      restResponse.ResponseStatus = ResponseStatus.Error; 
      restResponse.ErrorMessage = ex.Message; 
      restResponse.ErrorException = ex; 
     } 
     return restResponse; 
    } 

    public override IRestResponse<T> Execute<T>(IRestRequest request) 
    { 
     return Deserialize<T>(request, Execute(request)); 
    } 
} 
関連する問題