我有一个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格式的任何日期时间字符串。
有什么方法可以一致地处理这个问题吗?
答案 0 :(得分:2)
这是因为DateTime.Parse()考虑了系统时区(运行此代码的计算机)
解决方案就在这里
INNER JOIN
答案 1 :(得分:0)
如果您使用DateTimeOffset,它应该解决您的问题。我没有尝试重写已经存在的信息,而是指向一些现有资源:
DateTimeOffset值的这些用法比DateTime值更常见。因此,应将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"));