JSON 如果未为 DateTimeOffset 提供反序列化,则采用本地时区
JSON deserialization assumes local timezone if not provided for DateTimeOffset
所以我一整天都在用一个简单的设置来测试它。我正在将 JSON 字符串反序列化为 class 对象。唯一的 属性 是 DateTimeOffset
值。只是为了测试,我没有提供 JSON 日期 属性 的时区,因为我无法控制第三方发送给我的内容。一旦反序列化,属性 就采用了我系统的时区。我知道这可能是有意为之,但是否可以让它假定 UTC,因为我相信这对我的应用程序来说是更好的选择?
我想要的是:01/01/1900 00:00:00 +00:00
我曾尝试使用 JsonConverters
,但它似乎在进入 ReadJson
方法之前将其解析为 DateTimeOffset
,并且它无法让我访问 JSON 属性 值的字符串版本,以便我可以正确解析它。
下面的代码和示例:
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
如您所见,它采用了我的 +2 时区:
我能够通过以下设置哄骗 Json.Net 将没有偏移量的 DateTimeOffset
视为 UTC:
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)
工作演示:https://dotnetfiddle.net/Vgc9is
使用 JsonConverter
处理日期的关键是将 DateParseHandling
设置为 None
。否则内部 reader 将首先尝试处理它。
所以我一整天都在用一个简单的设置来测试它。我正在将 JSON 字符串反序列化为 class 对象。唯一的 属性 是 DateTimeOffset
值。只是为了测试,我没有提供 JSON 日期 属性 的时区,因为我无法控制第三方发送给我的内容。一旦反序列化,属性 就采用了我系统的时区。我知道这可能是有意为之,但是否可以让它假定 UTC,因为我相信这对我的应用程序来说是更好的选择?
我想要的是:01/01/1900 00:00:00 +00:00
我曾尝试使用 JsonConverters
,但它似乎在进入 ReadJson
方法之前将其解析为 DateTimeOffset
,并且它无法让我访问 JSON 属性 值的字符串版本,以便我可以正确解析它。
下面的代码和示例:
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
如您所见,它采用了我的 +2 时区:
我能够通过以下设置哄骗 Json.Net 将没有偏移量的 DateTimeOffset
视为 UTC:
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)
工作演示:https://dotnetfiddle.net/Vgc9is
使用 JsonConverter
处理日期的关键是将 DateParseHandling
设置为 None
。否则内部 reader 将首先尝试处理它。