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

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

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

最佳答案

这是因为 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"));

关于c# - 如何使用 Newtonsoft.JSON JObject 获得一致的日期时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192481/

相关文章:

c# - 在 .NET 中使用部分 JSON 更新反序列化对象

c# - Linq-To-JSON 查询以在分层 JSON 结构中查找特定属性的 sibling

c# - 使用带有 ItemRequired = Required.Always 的 Json.Net 反序列化时忽略属性

c# - 将属性传递给方法以进行读/写

c# - 在特定列上键入关键字时进行搜索

c# - 结构和垃圾回收

c# - 使用 FluentMigrator 添加代码和状态值的最佳实践?

c# - 为什么这个匿名类型不能使用 JsonConvert.DeserializeAnonymousType 正确反序列化?

c# - 如何从 JArray 获取子对象到 ObservableCollection

c# - DependencyProperty内存泄漏