我有一个 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/