Json.Net,如何使用“Z"而不是 +00:00 序列化 DateTimeOffset,但保留其他时区偏移量? [英] Json.Net, how to serialize DateTimeOffset with 'Z' instead of +00:00, but keep other timezone offsets?

查看:21
本文介绍了Json.Net,如何使用“Z"而不是 +00:00 序列化 DateTimeOffset,但保留其他时区偏移量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

With .NET Core and Json.NET, how can I serialize a DateTimeOffset (not DateTime) so that the UTC +00:00 becomes Z while keeping any other timezone offset (-04:00 for example)?

这篇 SO 帖子 适用于 DateTime,但有了它,我设法替换了+00:00 by Z 同时将所有时区转换为UTC

This SO post is for DateTime, but with it, I managed to replace the +00:00 by Z while converting all timezones to UTC

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

我想保留时区偏移信息,

I'd like to retain the timezone offset info, i.e.

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

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

DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK" 建议适用于 DateTime 但输出 +00:00,不是 Z,对于 DateTimeOffset...

The DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssK" suggested works for DateTime but outputs +00:00, not Z, for DateTimeOffset...

请参阅这个 .NET Fiddle 复制我的尝试.

推荐答案

你可以子类化 IsoDateTimeConverter 并覆盖 CanConvert 只转换 DateTimeOffsetDateTimeOffset? 类型的对象.然后,当 DateTimeOffset.Offset 为零时,以通用格式输出为 DateTime:

You could subclass IsoDateTimeConverter and override CanConvert to only convert objects of type DateTimeOffset and DateTimeOffset?. Then, when DateTimeOffset.Offset is zero, output as a DateTime in universal format:

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);
        }
    }       
}

然后像这样使用它:

var settings = new JsonSerializerSettings {
    Converters = {
        new IsoDateTimeOffsetConverter(),
    }
};

演示小提琴 此处.

这篇关于Json.Net,如何使用“Z"而不是 +00:00 序列化 DateTimeOffset,但保留其他时区偏移量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆