Json.Net,如何使用“Z"而不是 +00:00 序列化 DateTimeOffset,但保留其他时区偏移量? [英] Json.Net, how to serialize DateTimeOffset with 'Z' instead of +00:00, but keep other timezone offsets?
问题描述
使用 .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
只转换 DateTimeOffset
和 DateTimeOffset?
类型的对象.然后,当 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屋!