【问题标题】:Json.Net, how to serialize DateTimeOffset with 'Z' instead of +00:00, but keep other timezone offsets?Json.Net,如何使用“Z”而不是 +00:00 序列化 DateTimeOffset,但保留其他时区偏移量?
【发布时间】:2019-12-10 22:18:03
【问题描述】:

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

This SO post 用于DateTime,但有了它,我设法将+00:00 替换为Z,同时将所有 时区转换为UTC

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

我想保留时区偏移信息,

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

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

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

查看我的尝试this .NET Fiddle for a reproduction

【问题讨论】:

  • 我很快就回答了你的问题,但也许我误解了你的问题。您的问题是 1) 仅将您的转换器应用于DateTimeOffset? 2) 获取DateTimeOffset的正确格式?
  • 获取DateTimeOffset 的正确格式。即2019-12-10T17:00:00Z2019-12-10T13:00:00-04:00

标签: c# .net-core json.net


【解决方案1】:

您可以继承 IsoDateTimeConverter 并覆盖 CanConvert 以仅转换 DateTimeOffsetDateTimeOffset? 类型的对象。然后,当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);
        }
    }       
}

然后像这样使用它:

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

演示小提琴here.

【讨论】:

    猜你喜欢
    • 2020-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多