C# - 根据需要将 DateTime 和 DateTimeOffset 值反序列化为 UTC 和本地时间

问题描述 投票:0回答:1

我目前正在开发一个全栈应用程序,它从来不需要意识到时区,但看起来它很快就需要在了解当地时区和夏令时等方面变得更加通用。

我认为以下步骤可能是解决方案的核心:

  • 允许前端应用程序使用机器的本地时间(用于从日期时间选择器组件等中进行选择)。
  • 当数据发布到 API 时,无论是创建还是查询记录,任何
    DateTime
    DateTimeOffset
    值(目前均使用)都会在 JSON 负载中以本地时间发送,但一旦收到,从当地时间转换为 UTC。这意味着它可以采用 UTC 形式用于任何业务逻辑或存储在数据库中。
  • 当任何数据从 API 返回到客户端时(例如 GET 请求),客户端将以 UTC 形式接收数据,然后将其转换为机器的本地时间以用于显示等目的。

我尝试使用我编写的一些扩展方法来执行此操作,这将检查反序列化请求/响应的成员并相应地调整任何

DateTime
DateTimeOffset
字段。它在足够简单的情况下工作得很好,但随着对象变得更加复杂并涉及嵌套对象、可枚举等,它逐渐成为一个雷区。

我现在想知道 JSON 反序列化过程是否能够将值一致地反序列化到所需的时区。我环顾四周,但找不到任何具体的东西,所以想知道在这里提问是否可以获得新的视角。

我对任何和所有想法持开放态度,因此,如果我上面概述的方法并不理想,或者我在此过程中忽略了某些内容,请随时告诉我!

谢谢, 马克

c# json datetime timezone json-deserialization
1个回答
0
投票

不幸的是,C#(或更准确地说是.NET)没有一个类来处理 DateTime + TimeZone。 DateTimeOffset 为您提供 UTC + 偏移量,它没有 DST 的概念,因此在这里没有帮助。

我建议您创建一个如下所示的类,然后向其中添加您需要的任何辅助方法。在此类中,DateTime 是本地 DateTime,而不是 UTC。

在保存到数据库等地方,您必须同时保存这两项,这有点麻烦。但我十多年前就决定用这个来处理这种情况,而且效果一直很好。

public class DateTimeZone 
{
    public DateTime DateTime { get; }
    public string TimeZoneId { get; }
}
© www.soinside.com 2019 - 2024. All rights reserved.