2016-04-22 3 views
2

JSON, что я получаю от приложения имеет поле даты в формате, какC# - Отключить автоматическое UTC смещение для даты JSON

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

И когда он получает десериализации по RestSharp, дата становится равным

"04/22/2016 03:00:00" 

После непродолжительного расследования я понял, что RestSharp автоматически применяет смещение UTC для разобранной даты. Но в моем случае мне нужно получить то, что хранится в JSON честно.

Есть ли способ RestSharp отключить автоматическое применение UTC offset для полей даты в JSON?

Заранее спасибо

+0

Это всего лишь локальное представление даты. Дата такая же. –

+0

Если вы получили UTC-дату «» 04/22/2016 03:00:00 », вы, скорее всего, снова вернетесь к правильной версии. – RvdK

+1

. Это не дает вам дату UTC, детали * * 0000 * что дата - UTC – bit

ответ

0

RestSharp, скорее всего, использовать методы .Net DateTime для разбора строки в тип 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".

Один выход должен указать DateTimeKind для каждого из вас DateTime объектов как 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)); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^