2012-07-19 187 views
22

我正在使用json.net反序列化DateTimeOffset,但它忽略指定的時區並將日期時間轉換爲本地偏移量。例如,給定爲什麼Json.NET DeserializeObject將時區更改爲當地時間?

var content = @"{""startDateTime"":""2012-07-19T14:30:00+09:30""}"; 

當使用deserialised:

var jsonSerializerSettings = new JsonSerializerSettings() { DateFormatHandling = DateFormatHandling.IsoDateFormat, DateParseHandling = DateParseHandling.DateTimeOffset, DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind }; 
var obj = JsonConvert.DeserializeObject(content, jsonSerializerSettings); 

的物鏡將包含含有DateTimeOffset一個屬性但該值將是2012-07-19T15:30:00+10:30即轉換爲本地時區,而不是保留原始時區的。

有沒有一種方法可以按預期方式獲得值的解析,從而生成的DateTimeOffset屬性將與提供的值匹配?

+2

有趣的是,日期/時間實際上是正確的,在+ 14:30 9:30必須在15:30在+10:30。 – 2012-08-01 16:23:59

+0

不知道這裏是否有任何關係,但看起來WCF序列化/反序列化在默認情況下也是這樣做的。也許同樣的解決方案可以幫助你:http://daveonsoftware.blogspot.com/2008/07/wcf-datetime-field-adjusted.html – 2012-08-01 17:21:13

回答

9

它似乎忽略了DateParseHandling.DateTimeOffset並正在使用DateParseHandling.DateTime。我會在這裏記錄的問題:https://github.com/JamesNK/Newtonsoft.Json

+0

你解決了這個問題嗎?問題是什麼#? – Alex 2014-03-18 15:11:18

+0

我不知道這個bug是否已經修復。 – 2014-03-18 15:17:22

+3

https://github.com/JamesNK/Newtonsoft.Json/issues/45 - 修正 – alanh 2014-03-20 20:31:54

7

我不知道關於哪個版本你用,因爲在某個時間點,我們有同樣的問題,然後更新修復它...

您的代碼工作錯了,我還可以,但如果我喜歡

public class A 
{ 
    public DateTimeOffset startDateTime; 
} 

創建類並調用

var obj = JsonConvert.DeserializeObject<A>(content, jsonSerializerSettings); 

一切正常。是的,這是錯誤的肯定,是的,我不知道如何得到完全符合你想要的結果,但可能它會幫助別人。

6

嘗試使用這樣的:

microsoftDateFormatSettings = new JsonSerializerSettings 
{ 
    DateFormatHandling = DateFormatHandling.MicrosoftDateFormat, 
    DateTimeZoneHandling = DateTimeZoneHandling.Local 
}; 
var items = JsonConvert.DeserializeObject<List<lstObject>>(jsonString, microsoftDateFormatSettings); 

我不知道這是否會在所有情況下工作,但對我來說沒有。您可以嘗試其他DateTimeZoneHandling的值或在Google上搜索更多選項。

8

如果您使用的是.NET WebApi,則可以將以下內容添加到WebApiConfig.cs文件中,以便在您的應用程序中全局處理此問題。

config.Formatters.JsonFormatter.SerializerSettings.DateTimeZoneHandling = 
    Newtonsoft.Json.DateTimeZoneHandling.Local; 

確切地說,這將告訴JsonFormatter序列化和反序列化的日期時,包括和了解當地的時區信息。

+0

這是巨大的!非常感謝。 – bytebender 2017-02-13 19:27:35

0

這個工作對我來說,一個時區被保留

var jss = new JsonSerializerSettings 
    { 
     DateFormatHandling = DateFormatHandling.IsoDateFormat, 
     DateTimeZoneHandling = DateTimeZoneHandling.Local, 
     DateParseHandling = DateParseHandling.DateTimeOffset 
    }; 
var responseObj = JsonConvert.DeserializeObject<dynamic>(body, jss); 
return responseObj.Select(s => new { 
        id = s["id"].Value<int>(), 
        date = s["date"].Value<DateTimeOffset>().DateTime, 
       }); 

一個JSON的身體是這樣的

[ 
    { 
     "id": 211, 
     "date": "2017-10-22T12:00:00+03:00", 
     "status": 1 
    }, 
    { 
     "id": 212, 
     "date": "2017-10-28T12:00:00+03:00", 
     "status": 1 
    } 
] 
相關問題