C# JSON如何反序列化日期时间并从UTC转换到指定时区?
我想创建一个自定义json序列化程序,它将带有dateTime的对象转换为UTC和UTC,并返回到指定的时区。(非本地) 转换为UTC的示例如下:C# JSON如何反序列化日期时间并从UTC转换到指定时区?,c#,datetime,.net-core,timezone,jsonserializer,C#,Datetime,.net Core,Timezone,Jsonserializer,我想创建一个自定义json序列化程序,它将带有dateTime的对象转换为UTC和UTC,并返回到指定的时区。(非本地) 转换为UTC的示例如下: MyObject stuff = new MyObject(); stuff.Date = DateTime.Now; string asdd = JsonConvert.SerializeObject(stuff, new JsonSerializerSettings() {
MyObject stuff = new MyObject();
stuff.Date = DateTime.Now;
string asdd = JsonConvert.SerializeObject(stuff,
new JsonSerializerSettings()
{
DateTimeZoneHandling = DateTimeZoneHandling.Utc
});
如何通过JsonSerializerSettings或自定义序列化程序将UTC转换回特定时区
注意:我在.NET Core 2.1中工作。在序列化或反序列化时不应处理时区转换。这些是不同的关切 相反: 将
DateTimeZoneHandling
保留为默认值RoundtripKind
。(不要将其设置为Utc
)
这具有以下行为:
- 如果要反序列化到
,并且不在数据中传递偏移量,则将设置DateTime
DateTimeKind.Unspecified
- 如果要反序列化到
,并在数据中传递一个尾随DateTime
,则将设置Z
DateTimeKind.Utc
- 如果要反序列化到
,并在数据中传递偏移量,则将设置“DateTimeKind.Local”,并将该值转换为本地时区(通常应避免此情况)日期时间
- 如果要反序列化到
,则偏移量将被保留,并且值不会更改(如果传递偏移量,这是更好的方法)日期时间偏移量
DateTime
或DateTimeOffset
值,然后使用TimeZoneInfo.ConvertTime
和类似的方法更改时区(如果需要)。这一部分应该在应用程序代码中,因为它往往特定于特定API的逻辑
一般来说,尝试将所有传入或传出的日期/时间数据都处理在同一时区是一种反模式(),无论是通过序列化还是其他机制。在序列化或反序列化时不应处理时区转换。这些是不同的关切 相反: 将
DateTimeZoneHandling
保留为默认值RoundtripKind
。(不要将其设置为Utc
)
这具有以下行为:
- 如果要反序列化到
,并且不在数据中传递偏移量,则将设置DateTime
DateTimeKind.Unspecified
- 如果要反序列化到
,并在数据中传递一个尾随DateTime
,则将设置Z
DateTimeKind.Utc
- 如果要反序列化到
,并在数据中传递偏移量,则将设置“DateTimeKind.Local”,并将该值转换为本地时区(通常应避免此情况)日期时间
- 如果要反序列化到
,则偏移量将被保留,并且值不会更改(如果传递偏移量,这是更好的方法)日期时间偏移量
DateTime
或DateTimeOffset
值,然后使用TimeZoneInfo.ConvertTime
和类似的方法更改时区(如果需要)。这一部分应该在应用程序代码中,因为它往往特定于特定API的逻辑
一般来说,它是一种反模式(),尝试将所有传入或传出的日期/时间数据都处理在同一时区,无论是通过序列化还是其他机制