你可以告诉JSON.Net序列化date时间Utc即使未指定?
我的数据库中的date存储为Utc。 但是,当我把它们放回entity framework时,它们就是未指定的types。
当JSON.Net序列化它们时,它们不是Utc格式。 有没有办法告诉JSON.Net序列化date时间为Utc,即使他们的types没有指定为Utc?
将JsonSerializerSettings
上的DateTimeZoneHandling
设置为Utc
。 在序列化之前,将所有date转换为UTC。
public void SerializeObjectDateTimeZoneHandling() { string json = JsonConvert.SerializeObject( new DateTime(2000, 1, 1, 1, 1, 1, DateTimeKind.Unspecified), new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc }); Assert.AreEqual(@"""2000-01-01T01:01:01Z""", json); }
文档: DateTimeZoneHandling设置
上面的响应完全有效,所以我使用它来创build一个属性来将PST响应从PST转换为UTC。
首先,我需要创build一个JsonConverter
public class UTCDateTimeConverter : Newtonsoft.Json.JsonConverter { private TimeZoneInfo pacificZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); public override bool CanConvert(Type objectType) { return objectType == typeof(DateTime); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.Value == null) return null; var pacificTime = DateTime.Parse(reader.Value.ToString()); return TimeZoneInfo.ConvertTimeToUtc(pacificTime, pacificZone); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { writer.WriteValue(TimeZoneInfo.ConvertTimeFromUtc((DateTime) value, pacificZone)); } }
然后,我必须将其应用于需要转换的属性
public class Order{ [JsonConverter(typeof(UTCDateTimeConverter))] public DateTime OrderDate {get;set;} }