Json.Net,如何使用“Z”而不是 +00:00 序列化 DateTimeOffset,但保留其他时区偏移量?

dst*_*stj 5 c# json.net .net-core

使用 .NET Core 和 Json.NET,我如何序列化一个DateTimeOffset(not DateTime) 以便 UTC+00:00成为Z同时保持任何其他时区偏移(-04:00例如)?

这SO职位DateTime的,但有了它,我设法取代+00:00Z,而转换所有时区为UTC

new JsonSerializerSettings {
    Converters = new JsonConverter[] {
        new IsoDateTimeConverter {
            DateTimeStyles = DateTimeStyles.AdjustToUniversal,
            DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'",
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我想保留时区偏移信息,

2019-12-10T17:00:00Z 为了 new DateTimeOffset(2019, 12, 10, 17, 0, 0, TimeSpan.Zero)

2019-12-10T13:00:00-04:00 为了 new DateTimeOffset(2019, 12, 10, 13, 0, 0, TimeSpan.FromHours(-4))

DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK"建议的作品DateTime,但产出+00:00,不ZDateTimeOffset...

请参阅此 .NET Fiddle 以复制我的尝试。

dbc*_*dbc 6

您可以子类化IsoDateTimeConverter并重写CanConvert以仅转换类型为DateTimeOffset和的对象DateTimeOffset?。然后,当DateTimeOffset.Offset为零时,以通用DateTime格式输出:

public class IsoDateTimeOffsetConverter : IsoDateTimeConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(DateTimeOffset) || objectType == typeof(DateTimeOffset?);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var dateTimeOffset = (DateTimeOffset)value;
        if (dateTimeOffset.Offset == TimeSpan.Zero)
        {
            // If there is no offset, serialize as a DateTime
            base.WriteJson(writer, dateTimeOffset.UtcDateTime, serializer);
        }
        else
        {
            base.WriteJson(writer, value, serializer);
        }
    }       
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

var settings = new JsonSerializerSettings {
    Converters = {
        new IsoDateTimeOffsetConverter(),
    }
};
Run Code Online (Sandbox Code Playgroud)

演示小提琴在这里