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,那么偏移量将被保留并且值不会改变(如果传递偏移量,这是更好的方法)。

获得 DateTimeDateTimeOffset 值后,如有必要,请使用 TimeZoneInfo.ConvertTime 和类似方法更改时区。这部分应该在您的应用程序代码中,因为它往往特定于特定 API.

的逻辑

一般来说,无论是通过序列化还是其他机制,尝试将所有传入或传出 date/time 数据都置于同一时区是一种反模式 (SRP violation)。