Вопрос по entity-framework, javascript, asp.net – Можете ли вы указать JSON.Net сериализовать DateTime как Utc, даже если он не указан?

45

Даты в моей базе данных хранятся как Utc. Но когда я получаю их с помощью структуры сущностей, они появляются как неопределенные типы.

Когда JSON.Net их сериализует, они не в формате Utc. Есть ли способ сказать JSON.Net для сериализации DateTimes как Utc, даже если их тип не указан как Utc?

Я с тобой согласен. Я просто не знаю, как правильно указать вид, используя код EF. C.J.
Я предлагаю вам сделать DateTime.SpecifyKind () в вашем слое данных, чтобы он возвращал правильные даты. Либо чем, либо используйте вместо него DateTimeOffset. Неуказанный тип, выходящий из вашей базы данных, является распространенной проблемой, и он может вызвать множество других проблем, когда часовой пояс вашей системы не является UTC. dez

Ваш Ответ

3   ответа
1

Как упомянуто в комментарии @dez, вы можете & quot; пометить & quot; объекты DateTime как UTC непосредственно в коде .net сразу после ЗАГРУЗКИ их из БД и ПЕРЕД сериализацией:

var item = GetItemFromDb(...);

// mark appropriate DateTime fields manually as needed
item.OrderDate = DateTime.SpecifyKind(item.OrderDate, DateTimeKind.Utc);

// now it will be serialized to "2018-10-17T16:21:23.507Z" with the Z at the end
// and javascript will parse it properly and convert to local timezone as needed
9

Ответ выше полностью работает, и поэтому я использовал его для создания атрибута для преобразования ответа 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));
    }
}

Затем я должен был применить это к свойствам, которые должны были быть преобразованы

public class Order{
    [JsonConverter(typeof(UTCDateTimeConverter))]
    public DateTime OrderDate {get;set;}
}
92

ЗадаватьDateTimeZoneHandling наJsonSerializerSettings вUtc, Это преобразует все даты в 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 setting

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы