即使未指定,你能告诉JSON.Net将DateTime序列化为Utc吗?

C.J*_*.J. 51 javascript asp.net entity-framework json.net

我的数据库中的日期存储为Utc.但是当我用实体框架对它们进行修复时,它们的出现类型未指定.

当JSON.Net序列化它们时,它们不是Utc格式.有没有办法告诉JSON.Net将DateTimes序列化为Utc,即使它们的类型未指定为Utc?

Jam*_*ing 102

设置DateTimeZoneHandlingJsonSerializerSettingsUtc.这将在序列化之前将所有日期转换为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);
}
Run Code Online (Sandbox Code Playgroud)

文档:DateTimeZoneHandling设置

  • 你是英雄.好像你熟悉Json.net!大声笑 (11认同)
  • 有没有办法处理属性或全局(在网站中,而不是 api) (5认同)
  • 对我来说,这实际上没有任何区别.我的DateTimes有种=="未指定"但它们实际上是本地的.我是否有这个DateTimeZoneHandling它做同样的事情 - 假设UTC.我想这是有道理的,但是当我看到这个答案时,我认为它会将当地时间转换为UTC.请注意,myDateTime.ToUniversalTime()将其从本地转换为UTC. (4认同)
  • 是的,但假设默认时区的DateTime为UTC,则为疯狂。 (2认同)

Jus*_*ier 13

上面的响应完全有效,因此我使用它来创建一个属性,将API响应从PST转换为UTC.

首先,我需要创建一个 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));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我不得不将其应用于需要转换的属性

public class Order{
    [JsonConverter(typeof(UTCDateTimeConverter))]
    public DateTime OrderDate {get;set;}
}
Run Code Online (Sandbox Code Playgroud)