2015-11-23 98 views
3

我收到一個包含看起來像這樣的日期JSON字符串:2015-07-09T08:38:49-07:00,其中最後一部分是時區。有沒有一種標準的方式將其轉換爲DateTimeOffset轉換日期時間字符串格式:(YYYY-MM-dd'T'hh:MM:SS-ZZZ)

這是我到目前爲止有:

var olu = JsonConvert.DeserializeObject<OneLoginUser>(jToken.ToString(), new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd'T'HH:mm:sszzz" }); 

這不反序列化任何日期。我一直在使用的時區數據-Zhh:mm試過,但我似乎無法反序列化任何日期。

作爲參考,這是從OneLogin,一個SSO提供。 Here's a link給用戶文檔。注意關於頂部日期的一點。

+3

轉換爲字符串,然後使用DateTimeOffset而不是DateTime http://stackoverflow.com/questions/10293362/c-sharp-string-to-datetime-with-timezone –

+0

爲什麼你在你的格式字符串中有單引號? – Ben

+0

@ C.Knight - 是否可以使用JsonSerializerSetting?我看到DateTimeOffsetConverter,但我不知道如何設置格式。 – joelforsyth

回答

5

這是一個標準ISO 8601擴展格式時間戳與偏移量,也通過RFC 3339覆蓋。沒有什麼特別的。

DateTimeOffset.Parse("2015-07-09T08:38:49-07:00") 

或者

DateTimeOffset.ParseExact("2015-07-09T08:38:49-07:00", "yyyy-MM-dd'T'HH:mm:sszzz", 
                 CultureInfo.InvariantCulture) 

隨着JSON.Net,默認值應該很好地工作。不需要指定任何特殊的東西。

JsonConvert.DeserializeObject<DateTimeOffset>("\"2015-07-09T08:38:49-07:00\"") 

在討論的fiddle Brian posted評論表明,反序列化較大的物體時工作。如果你還沒有得到它的工作,也許你可以編輯你的問題,以顯示你試圖反序列化JSON具體和你把它變成對象結構。

一兩件事我注意到你的代碼,你看從jToken.ToString()傳來的JSON,這樣的地方必須使用JObject.Parse以前解析。這樣做有點奇怪,只是爲了轉換回json和反序列化。無論是從JSON字符串直接去使用JsonConvert.DeserializeObject實體,或使用jToken.ToObject<OneLoginUser>()如果您已經在與jToken啓動一些其他原因。無需混合使用這兩種API,並且可能會在流程中丟失日期/時間信息,具體取決於您的設置。

0

嘗試格式字符串是這樣的:

"yyyy-MM-dd'T'hh:mm:ss%K" 

正如你看到的例子,這種分析比你指定什麼更好的(重複的HH:MM可能是擰東西)。

string input = "2015-07-09T08:38:49-07:00"; 
DateTime dt = DateTime.ParseExact(input, "yyyy-MM-dd'T'hh:mm:ss%K", System.Globalization.CultureInfo.InvariantCulture); 
Console.WriteLine(input); 
Console.WriteLine(dt.ToString()); 
+0

解析時可能會有效,但我必須對其進行反序列化。正如@ C.Knight指出的,我可能不得不將它做成一個字符串,然後解析。 – joelforsyth

+0

@joelforsyth我的觀點是,你可以在反序列化方法中使用更新後的格式字符串(假設該方法不起作用)。擁有第二個「hh:mm」可能會導致數據的反序列化和解析錯誤。 – CodeMonkey1313

+0

它看起來像'zzz'是用於時區的格式,但我無法讓它工作。參考:http://stackoverflow.com/questions/7003373/how-to-get-datetime-now-in-yyyy-mm-ddthhmmsstzd-format-using-c-sharp – joelforsyth

相關問題