보통 .net에서 시간이있는 경우 DateTimeKind.Unspecified ToLocal을 변환하면 변환 할 때 입력 날짜가 UTC라고 가정합니다. ToUniversal을 변환하는 경우 - 변환 할 때 입력 날짜가 로컬이라고 가정합니다.날짜 시간 '지정되지 않음'의 json.net 직렬화/비 직렬화
그러나 JSON.Net에서 문자열 날짜가 지정되지 않은 경우이 논리가없는 것 같습니다. 아래의 테스트 사례를 살펴 보겠습니다. 제가 잘못하고있는 것입니까? 또는 디자인에 의한 것인가? 또는 JSON.Net의 버그? 감사합니다.
// TODO: This Fails with output
// date string: "2014-06-02T21:00:00.0000000"
// date serialized: 2014-06-02T21:00:00.0000000Z
// Expected date and time to be <2014-06-03 04:00:00>, but found <2014-06-02 21:00:00>.
[TestMethod]
public void NEW_Should_deserialize_unspecified_datestring_to_utc_date()
{
string dateString = "\"2014-06-02T21:00:00.0000000\"";
DateTime dateRaw = new DateTime(2014, 6, 2, 21, 0, 0, 0, DateTimeKind.Unspecified);
DateTime dateRawAsUtc = new DateTime(2014, 6, 3, 4, 0, 0, 0, DateTimeKind.Utc);
dateRawAsUtc.Should().Be(dateRaw.ToUniversalTime());
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
DateTime dateSerialized = JsonConvert.DeserializeObject<DateTime>(dateString, settings);
Console.WriteLine("date string: " + dateString);
Console.WriteLine("date serialized: " + dateSerialized.ToString("o"));
dateSerialized.Kind.Should().Be(DateTimeKind.Utc);
dateSerialized.Should().Be(dateRaw.ToUniversalTime());
dateSerialized.Should().Be(dateRawAsUtc);
}
// TODO: This Fails with output
// date string: "2014-06-02T21:00:00.0000000"
// date serialized: 2014-06-02T21:00:00.0000000-07:00
// Expected date and time to be <2014-06-02 14:00:00>, but found <2014-06-02 21:00:00>.
[TestMethod]
public void NEW_Should_deserialize_unspecified_datestring_to_local_date()
{
string dateString = "\"2014-06-02T21:00:00.0000000\"";
DateTime dateRaw = new DateTime(2014, 6, 2, 21, 0, 0, 0, DateTimeKind.Unspecified);
DateTime dateRawAsLocal = new DateTime(2014, 6, 2, 14, 0, 0, 0, DateTimeKind.Local);
dateRawAsLocal.Should().Be(dateRaw.ToLocalTime());
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Local;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
DateTime dateSerialized = JsonConvert.DeserializeObject<DateTime>(dateString, settings);
Console.WriteLine("date string: " + dateString);
Console.WriteLine("date serialized: " + dateSerialized.ToString("o"));
dateSerialized.Kind.Should().Be(DateTimeKind.Local);
dateSerialized.Should().Be(dateRaw.ToLocalTime());
dateSerialized.Should().Be(dateRawAsLocal);
}
[TestMethod]
public void NEW_Should_deserialize_unspecified_datestring_to_unspecified_date()
{
string dateString = "\"2014-06-02T21:00:00.0000000\""; // unspecified, does not have the 'Z'
DateTime dateRaw = new DateTime(2014, 6, 2, 21, 0, 0, 0, DateTimeKind.Unspecified);
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Unspecified;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
DateTime dateSerialized = JsonConvert.DeserializeObject<DateTime>(dateString, settings);
Console.WriteLine("date string: " + dateString);
Console.WriteLine("date serialized: " + dateSerialized.ToString("o"));
dateSerialized.Kind.Should().Be(DateTimeKind.Unspecified);
dateSerialized.Should().Be(dateRaw);
}
시도를 :
이 전체, 개정 된 첫 번째 테스트는 다음과 같이하고이 통과된다는 것을 의미합니다 : 당신의 도움의 손길이 놀이로 오는 곳 여기입니다 'DateTime'. 그것은 반드시 deserialize해야합니다. – daramasala