我有一个DateTimeOffset对象" 05/06/2014 05:54:00 PM -04:00"。
使用Json.NET和ISO设置进行序列化时,我得到" 2014-05-06T17:54:00-04:00"。
我想要的是该字符串的UTC / Zulu版本" 2014-05-06T21:54:00Z"。
但是,我找不到任何序列化程序设置来实现此目的。我知道对于DateTime序列化,我可以设置DateTimeZoneHandling = DateTimeZoneHandling.Utc以具有Zulu格式。但是,DateTimeOffset没有这样的设置选项。我错过了什么吗?或者我是否必须为此创建自定义覆盖?
答案 0 :(得分:17)
尝试使用Json.Net附带的IsoDateTimeConverter
:
var date = new DateTime(2014, 5, 6, 17, 24, 55, DateTimeKind.Local);
var obj = new { date = new DateTimeOffset(date) };
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.Converters.Add(new IsoDateTimeConverter
{
DateTimeFormat = "yyyy-MM-ddTHH:mm:ssZ",
DateTimeStyles = DateTimeStyles.AdjustToUniversal
});
string json = JsonConvert.SerializeObject(obj, settings);
Console.WriteLine(json);
输出:
{"date":"2014-05-06T22:24:55Z"}
答案 1 :(得分:7)
您可以编写如下自定义转换器:
class UtcDateTimeOffsetConverter : Newtonsoft.Json.Converters.IsoDateTimeConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value is DateTimeOffset)
{
var date = (DateTimeOffset)value;
value = date.UtcDateTime;
}
base.WriteJson(writer, value, serializer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
object value = base.ReadJson(reader, objectType, existingValue, serializer);
if (value is DateTimeOffset)
{
var date = (DateTimeOffset)value;
value = date.ToLocalTime();
}
return value;
}
}
使用JsonConverter
属性将其应用于您想要的媒体资源:
[JsonConverter(typeof(UtcDateTimeOffsetConverter))]
public DateTimeOffset Date { get; set; }