2017-07-20 190 views
3

我有以下問題RestSharp將日期時間轉換爲UTC

我正在使用RestSharp來訪問我的API。但是當我發送日期時間時,它似乎被轉換爲UTC。 我發送'10 .06.1991 00:00',API獲取'09 .06.1991 22:00'

因此,當我的API獲取DateTime對象時,我總是需要添加2個小時?

我檢查了JSON RestSharp發送到API。

public class Test 
{ 
    public int IntProperty {get;set;} 
    public string StringProperty {get;set;} 
    public DateTime DateTimeProperty {get;set;} 
} 

我的目標是

Test t = new Test{ IntProperty=3, StringProperty="string", DateTimeProperty=new DateTime(1991,06,10) } 

,當我通過RestSharp發送對象,我的API接收JSON是

{ 
    "IntProperty":3, 
    "StringProperty":"string", 
    "DateTimeProperty":"09.06.1991 22:00:00" 
} 

任何想法,我能做些什麼? 謝謝

+0

這是同樣的問題,因爲https://github.com/restsharp/RestSharp/issues/691? – mjwills

回答

2

這不是你的API接收到錯誤的數據,它是你的客戶發送「錯誤」的數據。我的API遇到了同樣的問題。 不,這是正確的數據,但轉換爲UTC。

確切的問題說明如下:https://github.com/restsharp/RestSharp/issues/834

所以,不要2小時添加到你得到它的API中的每個日期時間。當另一個客戶端發送未轉換的日期時,您可能會更改正確的數據。

  1. 您可以檢查是否在GET上收到正確的日期。也許RestSharp正在將那個「錯誤」的日期時間轉換回10.06.1991 00:00 - 也許你還好吧
  2. 如果你想讓數據庫不包含UTC,但你原來想發送的數據,不要使用默認的序列化程序,使用JSON .Net(http://www.newtonsoft.com/json)。它不會轉換爲UTC併發送原始的DateTime。

下面是關於如何實現一個真正的好例子:http://bytefish.de/blog/restsharp_custom_json_serializer/

  • 你寫在連載實現ISerializerIDeserializer
  • 的自定義類調用JSON.Net Serialize而在反序列化你調用JSON。淨Deserialize

  • 你只需要一個處理程序添加到您的RESTClient實現這樣的:(我使用在提到博客中描述的靜態默認實例)

我的客戶是這樣的:

private readonly RestClient _client; 

public RestApiClient(string apiAdress) 
{ 
    _client = new RestClient(apiAdress); 
    _client.AddHandler("application/json", NewtonsoftJsonSerializer.Default); 
} 

,並請求您可以設置JsonSerializer

IRestRequest restRequest = 
     new RestRequest(request.GetRestfulUrl(), request.Method) { 
      RequestFormat = request.DataFormat, 
      JsonSerializer = NewtonsoftJsonSerializer.Default 
     }; 
+0

什麼變量是'request'? –

+0

它只是一個包含請求API的路徑和其他信息的對象。沒什麼特別的。重要的是將JsonSerializer設置爲使用Json.Net的那個。 –

1

我想這是因爲你的DateTime對象有DateTime.Kind屬性等於DateTimeKind.Unspecified - 它打破了本地和utc類型之間的所有轉換。我的意思是一些工具假設你的日期時間是在Utc,當它不是真的。

所以,只是不要與工具,必須猜測你和你的客戶之間的正確的DateTimes類型的工具。只需在世界各地使用UTC並將其轉換爲本地,即可向用戶顯示。

,或者甚至更好,使用DateTimeOffset哪個更適合對付多區域次..甚至使用喬恩斯基特的NodaTime庫,它是一個瑞士軍刀任何時間有關的工作(雖然也許它是你的情況矯枉過正)。

UPD。在下面的評論中回答@Matthias Burger提出的問題:

你會如何處理像出生日期這樣的日期?我認爲「10.06.1991」可能是一個生日。意味着,在UTC他的生日不同於格林尼治標準時間 - 不是嗎?

一如既往 - 這取決於:)

隨着時間是一件棘手的事情,你要小心 - 有從喬恩斯基特的博客大約joys of date/time arithmetic一個偉大的文章。老實說,我知道這不是一個真正的答案,但是有太多不同的可能的問題案例 - 我們是否需要比較日期,他們是否在同一日曆中,我們是否假設所有人都在當地時區的午夜出生,等

在已經提到NodaTime有一個全球和本地時間的概念(看看它的concepts page)。我認爲對於最簡單的情況,當我們需要存儲並顯示生日LocalDate(當地日期即時)就足夠了。即使DateTime就足夠了,如果您存儲本地日期併爲所有人注視同一時區(因此它會像您根本不使用時區)。

P.S.順便說一句,不知道最後一個問題是否是一個支票,但UTC is a standard and GMT is a time zone;)

+0

只爲我的調停和更好的理解:你如何處理像出生日期這樣的日期?我認爲「10.06.1991」可能是一個生日。意味着,在UTC他的生日不同於格林尼治標準時間 - 不是嗎? –

+1

@MatthiasBurger更新了我的答案) – pkuderov