如何使用Newtonsoft.JSON JObject获得一致的日期时间值

时间:2017-05-26 02:04:04

标签: c# json.net

我有一个ASP.Net Core服务,它使用Newtonsoft.Json库来处理JSON数据。 示例JSON输入具有一个字符串,该字符串包含ISO8601格式的日期值。 但是,我观察的是等效日期返回的不同日期时间值。 以下是示例代码 -

    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格式的任何日期时间字符串。

有什么方法可以一致地处理这个问题吗?

3 个答案:

答案 0 :(得分:2)

这是因为DateTime.Parse()考虑了系统时区(运行此代码的计算机)

解决方案就在这里

INNER JOIN

答案 1 :(得分:0)

如果您使用DateTimeOffset,它应该解决您的问题。我没有尝试重写已经存在的信息,而是指向一些现有资源:

  

DateTimeOffset值的这些用法比DateTime值更常见。因此,应将DateTimeOffset视为应用程序开发的默认日期和时间类型。

     

来自MSDN Development Guide

DateTime vs DateTimeOffset

答案 2 :(得分:0)

我尝试过使用JsonConvert.DeserializeObject(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"));