使用未指定的DateTimeKind的DateTime格式序列化

时间:2019-05-13 12:42:54

标签: c# json.net

我写了一个小例子,展示了使用Json.NET库从字符串反序列化日期时间类型:

  1. 具有指定的偏移量
  2. 未指定时区
  3. 具有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

0 个答案:

没有答案