2017-05-26 86 views
0

我有一個ASP.Net核心服務,它使用Newtonsoft.Json庫來處理JSON數據。 示例JSON輸入包含一個字符串,其中包含ISO8601格式的日期值。 但是,我正在觀察不同的日期時間值是否會返回相應的日期。 下面是示例代碼 -如何獲得與Newtonsoft.JSON一致的日期時間值JObject

var jsonString = @"{ 
     ""data"": { 
      ""name"": ""John Doe"", 
      ""dateOfBirth"": ""1990-05-25T15:54:49.119+00:00"" 
     } 
    }"; 

    var jsonObj = JObject.Parse(jsonString); 
    var person = jsonObj.ToObject<Person>(); 

    DateTime dateOfBirth = DateTime.Parse(person.Data.DateOfBirth); 
    if (dateOfBirth.Kind != DateTimeKind.Utc) 
    { 
     dateOfBirth = dateOfBirth.ToUniversalTime(); 
    } 
    Console.WriteLine("Date of birth is " + dateOfBirth.ToString("o")); 

Person類是這樣的 -

class Person 
{ 
    public PersonalData Data; 
} 

class PersonalData 
{ 
    public string Name { get; set; } 
    public string DateOfBirth { get; set; } 
} 

如果我提供""dateOfBirth"": ""1990-05-25T15:54:49.119+00:00 「」 時,輸出爲 -

Date of birth is 1990-05-25T15:54:49.0000000Z 

如果我提供""dateOfBirth"": ""1990-05-25T15:54:49.119Z"" ,輸出是 -

Date of birth is 1990-05-25T10:24:49.0000000Z 

可以看出,輸出是不同的,因爲它應該是相同的。呼叫者可以設置ISO8601格式的任何日期時間字符串。

有什麼辦法可以一致地處理這個問題嗎?

回答

0

如果您使用DateTimeOffset它應該解決您的問題。我不會嘗試重寫已存在的信息,而是指向一些現有資源:

DateTimeOffset值的這些用法比DateTime值的用法要普遍得多。因此,應將DateTimeOffset視爲應用程序開發的默認日期和時間類型。

MSDN Development Guide

DateTime vs DateTimeOffset

+0

我不認爲這個問題是與日期時間。問題發生在Json.Net上,當字符串具有「Z」後綴或「00:00」時,日期時間轉換不同。 – tyrion

+0

字符串爲「」時給出正確結果1990-05-25T15:54:49.119 + 00: 00「」 – tyrion

1

這是因爲DateTime.Parse()考慮到系統時區(計算機運行此代碼)

的解決方案是在這裏

var jsonString = @"{ 
     ""data"": { 
      ""name"": ""John Doe"", 
      ""dateOfBirth"": ""1990-05-25T15:54:49.119+00:00"" 
     } 
    }"; 
var jsonObj = JObject.Parse(jsonString); 
var person = jsonObj.ToObject<Person>(); 

var dateTimeOffset = DateTimeOffset.Parse(person.Data.DateOfBirth, CultureInfo.InvariantCulture); 
DateTime dateOfBirth = dateTimeOffset.UtcDateTime; 
Console.WriteLine("Date of birth is " + dateOfBirth.ToString("o")); 
+0

當輸入是 - 「」dateOfBirth「」:「」1990-05-25T15:54:49.119Z「」 – tyrion

0

我試過使用JsonConvert.DeserializeObje ct(jsonString)並獲得了預期的輸出。請檢查此琴

https://dotnetfiddle.net/uuZvab

Person person = JsonConvert.DeserializeObject<Person>(jsonString); 
       DateTime dateOfBirth = DateTime.Parse(person.Data.DateOfBirth); 
       if (dateOfBirth.Kind != DateTimeKind.Utc) 
       { 
        dateOfBirth = dateOfBirth.ToUniversalTime(); 
       } 
       Console.WriteLine("Date of birth is " + dateOfBirth.ToString("o")); 
+0

仍然有同樣的問題在示例中,我必須做的代碼來做JObject。解析()以獲得JObject。然而,在我的生產代碼中,它的asp.net框架代碼將JObject的生日日期屬性已經填充。 – tyrion

+0

我應該做JObject.ToString()傳遞給JsonConvert.DeserializeObject方法嗎? – tyrion

+0

認爲這將做伎倆 '字符串json = myJObject.ToString(Newtonsoft.Json.Formatting.None);' – snehgin

相關問題