我写了一个小例子,展示了使用Json.NET库从字符串反序列化日期时间类型:
具有UTC时区(具有Z)
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
// With offset
string d1 = "\"2018-03-14T06:29:29+05:00\"";
DateTime date1 = JsonConvert.DeserializeObject<DateTime>(d1, settings);
Console.WriteLine("date1: " + date1.ToString("o"));
// Not specified
string d2 = "\"2018-03-14T06:29:29\"";
DateTime date2 = JsonConvert.DeserializeObject<DateTime>(d2, settings);
Console.WriteLine("date2: " + date2.ToString("o"));
// With Z
string d3 = "\"2018-03-14T06:29:29Z\"";
DateTime date3 = JsonConvert.DeserializeObject<DateTime>(d3, settings);
Console.WriteLine("date3: " + date3.ToString("o"));
Console.ReadLine();
我将DateTimeZoneHandling
设置为UTC时区。
我的当地时区有一个偏移量+03:00
。
根据ISO8601,
ISO 8601中的时区表示为本地时间(带有 未指定位置),UTC或UTC的偏移量。
我希望看到以下输出
date1:2018-03-14T01:29:29.0000000Z
date2:2018-03-14T03:29:29.0000000Z
日期3:2018-03-14T06:29:29.0000000Z
但是我得到了这样的输出
date1:2018-03-14T01:29:29.0000000Z
date2:2018-03-14T06:29:29.0000000Z
日期3:2018-03-14T06:29:29.0000000Z
使用Z且未指定时区的字符串进行反序列化会产生相同的值。
我不理解这种行为。
问题:这种行为是否违反ISO 8601?
更新:
在我的示例中,我在输出中添加了一个datetime偏移量,对我来说似乎更为扼腕。
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
settings.DateFormatHandling = DateFormatHandling.IsoDateFormat;
string d1 = "\"2018-03-14T06:29:29+05:00\"";
DateTime date1 = JsonConvert.DeserializeObject<DateTime>(d1, settings);
DateTimeOffset date1Offset = JsonConvert.DeserializeObject<DateTimeOffset>(d1, settings);
Console.WriteLine("date1: " + date1.ToString("o"));
Console.WriteLine("date1Offset: " + date1Offset.ToString("o"));
string d2 = "\"2018-03-14T06:29:29\"";
DateTime date2 = JsonConvert.DeserializeObject<DateTime>(d2, settings);
DateTimeOffset date2Offset = JsonConvert.DeserializeObject<DateTimeOffset>(d2, settings);
Console.WriteLine("date2: " + date2.ToString("o"));
Console.WriteLine("date2Offset: " + date2Offset.ToString("o"));
string d3 = "\"2018-03-14T06:29:29Z\"";
DateTime date3 = JsonConvert.DeserializeObject<DateTime>(d3, settings);
DateTimeOffset date3Offset = JsonConvert.DeserializeObject<DateTimeOffset>(d3, settings);
Console.WriteLine("date3: " + date3.ToString("o"));
Console.WriteLine("date3Offset: " + date3Offset.ToString("o"));
更新后的输出:
date1:2018-03-14T01:29:29.0000000Z
date1Offset:2018-03-14T06:29:29.0000000 + 05:00
date2:2018-03-14T06:29:29.0000000Z
date2Offset:2018-03-14T06:29:29.0000000 + 03:00
date3:2018-03-14T06:29:29.0000000Z
date3Offset:2018-03-14T06:29:29.0000000 + 00:00