我有一个使用Newtonsoft.Json库处理JSON数据的ASP.Net Core服务。
样例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 格式中设置任何日期时间字符串。
是否有一种方法可以始终处理这种情况?
dateOfBirth.Kind
不是DateTimeKind.Utc
,则应该写成if (dateOfBirth.Kind == DateTimeKind.Local)
。否则您需要将DateTimeKind.Unspecified
转换为协调世界时,这意味着它将其解释为本地时间。如果它是未指定的,则应使用DateTime.SpecifyKind(dateOfBirth, DateTimeKind.Utc)
。 - Jesse de Wit