J'ai donc testé cela toute la journée avec une configuration simple. Je désérialise une chaîne JSON dans un objet de classe. La seule propriété est pour une valeur DateTimeOffset. Juste pour tester, je ne fournis pas de fuseau horaire avec la propriété de date JSON car je ne pourrai pas contrôler ce qu'un tiers m'enverrait. Une fois désérialisée, la propriété a pris le fuseau horaire de mon système. Je comprends que c'est probablement intentionnel, mais est-il possible de le faire assumer UTC car je pense que ce serait une meilleure option pour mon application ?

Ce que je veux que ce soit : 01/01/1900 00:00:00 +00:00

J'ai essayé d'utiliser JsonConverters, mais il semble l'analyser comme un DateTimeOffset avant d'atteindre la méthode ReadJson et cela ne me donne pas accès à la version de chaîne JSON de la propriété valeur afin que je puisse l'analyser correctement.

Code et exemple ci-dessous :

Public Class MyTest

    Public Property DTO As DateTimeOffset = #1900-01-01#

End Class

Public Sub TestMethod()

    Dim myDate As String = "{""DTO"": ""1900-01-01T00:00:00""}"

    Dim o = JsonConvert.DeserializeObject(Of MyTest)(myDate, 
        New JsonSerializerSettings With {
            .DateParseHandling = DateParseHandling.DateTimeOffset,
            .DateTimeZoneHandling = DateTimeZoneHandling.Utc
        })

 End Sub

Comme vous pouvez le voir, il a assumé mon fuseau horaire +2 :

Screenshot of myDate after deserialization

2
Matt Hawkes 7 oct. 2019 à 14:45

1 réponse

Meilleure réponse

J'ai pu persuader Json.Net de traiter DateTimeOffset sans décalage comme UTC avec les paramètres suivants :

Dim settings As New JsonSerializerSettings With {
    .DateParseHandling = DateParseHandling.None
}
settings.Converters.Add(New IsoDateTimeConverter With {
    .DateTimeStyles = DateTimeStyles.AssumeUniversal
})

Dim o = JsonConvert.DeserializeObject(Of MyTest)(myDate, settings)

Démonstration fonctionnelle : https://dotnetfiddle.net/Vgc9is

La clé lors de l'utilisation d'un JsonConverter pour gérer les dates est de définir DateParseHandling sur None. Sinon, sinon le lecteur interne essaiera de le gérer en premier.

2
Brian Rogers 7 oct. 2019 à 16:22