Runtime: System.Text.Json par défaut DateTimeZoneHandling

Créé le 1 oct. 2019  ·  3Commentaires  ·  Source: dotnet/runtime

Dans JSON.NET, vous pouvez :

JsonConvert.DefaultSettings = () => new JsonSerializerSettings {
    DateTimeZoneHandling = DateTimeZoneHandling.Utc
};

Y a-t-il quelque chose de similaire dans System.Text.Json ?
S'il n'y a pas d'option pour définir la valeur par défaut, peut-elle être transmise manuellement ?

De plus, quelle est la valeur par défaut ( Local , Utc , Unspecified ) ?

area-System.Text.Json

Commentaire le plus utile

@btecu malheureusement le seul moyen, je pense, d'avoir l'option similaire dans System.Text.Json est de faire :

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });

et implémenter DateTimeConverter comme ça

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
         writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}

Tous les 3 commentaires

cc @layomia sur les dates

Puisqu'un DateTime peut être défini dans chacun de ces formats (par exemple avec et sans le fuseau horaire\offset), le lecteur\écrivain (et donc le sérialiseur) utilise ce qui est disponible et utilise\assume un format ISO 8601 pour le représenter.

@btecu le profil ISO 8601 est utilisé par défaut dans le sérialiseur, par exemple 2019-07-26T16:59:57-05:00.

Pour la désérialisation, si l'offset datetime est donné comme "hh:mm", un DateTime avec DateTimeKind.Local est créé. "Z" donnera DateTimeKind.Utc . Si aucun décalage n'est donné, alors un DateTime avec DateTimeKind.Unspecified est créé.
Le mappage inverse s'applique à la sérialisation : écrire un DateTime avec DateTimeKind.Local produira une représentation ISO avec un décalage au format "hh:mm", et ainsi de suite.

Pour plus d'informations sur la prise en charge de DateTime et DateTimeOffset dans System.Text.Json et sur la façon dont vous pouvez implémenter une analyse ou une mise en forme personnalisée, consultez https://docs.microsoft.com/en-us/dotnet/standard/datetime/system-text-json -Support.

@btecu malheureusement le seul moyen, je pense, d'avoir l'option similaire dans System.Text.Json est de faire :

services.AddControllers()
    .AddJsonOptions(options =>
     {
         options.JsonSerializerOptions.Converters.Add(new DateTimeConverter());
     });

et implémenter DateTimeConverter comme ça

public class DateTimeConverter : JsonConverter<DateTime>
{
    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return DateTime.Parse(reader.GetString());
    }

    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)
    {
         writer.WriteStringValue(value.ToUniversalTime().ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ssZ"));
    }
}
Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

jamesqo picture jamesqo  ·  3Commentaires

matty-hall picture matty-hall  ·  3Commentaires

ilmax picture ilmax  ·  3Commentaires

sahithreddyk picture sahithreddyk  ·  3Commentaires

aggieben picture aggieben  ·  3Commentaires