JSON 如何反序列化日期时间并将UTC 转换为指定时区?
How JSON deserialize datetime and convert from UTC to a specified time zone?
我想创建一个自定义 json 序列化程序,它将带有 dateTime 的对象与 UTC 相互转换并返回指定时区。 (非本地)
转换为 UTC 的示例是:
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
。
- 如果你反序列化为
DateTime
,并在你的数据中传递一个偏移量,那么将设置 `DateTimeKind.Local,并且该值将被转换为本地时区(通常是一个应该避免这种情况。
- 如果你反序列化为
DateTimeOffset
,那么偏移量将被保留并且值不会改变(如果传递偏移量,这是更好的方法)。
获得 DateTime
或 DateTimeOffset
值后,如有必要,请使用 TimeZoneInfo.ConvertTime
和类似方法更改时区。这部分应该在您的应用程序代码中,因为它往往特定于特定 API.
的逻辑
一般来说,无论是通过序列化还是其他机制,尝试将所有传入或传出 date/time 数据都置于同一时区是一种反模式 (SRP violation)。
我想创建一个自定义 json 序列化程序,它将带有 dateTime 的对象与 UTC 相互转换并返回指定时区。 (非本地)
转换为 UTC 的示例是:
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
。 - 如果你反序列化为
DateTime
,并在你的数据中传递一个偏移量,那么将设置 `DateTimeKind.Local,并且该值将被转换为本地时区(通常是一个应该避免这种情况。 - 如果你反序列化为
DateTimeOffset
,那么偏移量将被保留并且值不会改变(如果传递偏移量,这是更好的方法)。
获得 DateTime
或 DateTimeOffset
值后,如有必要,请使用 TimeZoneInfo.ConvertTime
和类似方法更改时区。这部分应该在您的应用程序代码中,因为它往往特定于特定 API.
一般来说,无论是通过序列化还是其他机制,尝试将所有传入或传出 date/time 数据都置于同一时区是一种反模式 (SRP violation)。