2017-05-25 33 views
0

我有它返回一個json這樣的服務:C#:無法解析正確的日期和時間設置爲當前系統時間區

[ 
    { 
     "title":"First event", 
     "startDate":"\/Date(1495512000000-0400)\/", 
     "endDate":"\/Date(1495857540000-0400)\/", 
    } 
] 

我反序列化JSON輸出到列表中相對於模型我已經定義:

型號

public class EventModel 
{ 
    [JsonProperty("title")] 
    public string Title { get; set; } 

    [JsonProperty("startDate")] 
    public DateTime StartDate { get; set; } 

    [JsonProperty("endDate")] 
    public DateTime EndDate { get; set; } 
} 

C#deseria的代碼lization

我正在使用Newtonsoft.Json包進行反序列化。

List<EventModel> lstEvent = new List<EventModel>(); 
lstEvent = JsonConvert.DeserializeObject<List<EventModel>>(await objMyServices.GetData()); 

所以,當我調試我得到以下輸出在兩個不同的時區這種情況下:

對於GMT + 5:30(加爾各答 - 印度):

開始時間:23 -05-2017 09:30:00

結束時間:27-05-2017九時29分零零秒

對於GMT-4:00(紐約):

開始時間:23-05-2017 00:00:00

結束時間:26-05-2017 23:59:00

因此,對於每一條記錄,開始時間不解析,當我切換到GMT-4:00(紐約)時的相應系統時區。 我在這裏錯過了什麼?

+0

這不是Json的日期。 JSon日期根據ISO8601進行格式化。這是AJAX時代的一種非常古老的格式。一些*非常*舊的服務仍然使用它,雖然 –

+0

此外,您使用DateTime可以是本地,UTC或未定義。返回日期的DateTimeKind屬性是什麼?如果在紐約將本地時間轉換爲相同的UTC時間,則它們的顯示方式會有所不同,但它仍然是同一時間。如果您沒有明確指定要使用什麼DateTimeKind –

+0

@PanagiotisKanavos - 我相信它*應該*使用ISO8601,但它沒有任何要求:https:// stackoverflow。com/questions/10286204/the-right-json-date-format – CodeNaked

回答

1

Json.NET允許您指定通過DateTimeZoneHandling序列化程序設置返回什麼樣的DateTime(UTC,Local)。默認是本地。

要返回UTC日期時間,使用DateTimeZoneHandling.Utc:

var settings = new Newtonsoft.Json.JsonSerializerSettings() 
       { 
        DateTimeZoneHandling = DateTimeZoneHandling.Utc 
       }; 
var content=await objMyServices.GetData(); 
var lstEvent = JsonConvert.DeserializeObject<List<EventModel>>(content, settings); 

也許是更好的選擇是改變屬性類型的DateTimeOffset。這種類型保留了原始偏移量。

+0

當我將屬性更改爲DateTimeOffset時,我沒有時間。輸出是:StartDate {23-05-2017 00:00:00 -04:00} –

+0

是不是實際值,'23-05-2017 00:00:00 -04:00'?第二個'26-05-2017 23:59:00 -04:00'? –

+0

是的,我將如何獲得當地時間和日期。由於它是UTC。我需要將本地日期和時間的事件添加到設備日曆 –

0

您可以在此Web API中使用Ticks。當您使用多個時區時,這非常方便。參考下面的例子。

DateTime.UtcNow.Ticks