将日期从 Azure Table 存储转换回用户的时区

Converting Date back to user's timezone from Azure Table Storage

据我了解,Azure Table 存储将所有日期时间字段存储为 UTC 又名祖鲁时间。

目前我在英国 2021 年 5 月 11 日 18:10。这里的当前时区是 BST (+1:00)。

如果我使用 RoundtripKind 选项将其序列化为 JSON

string json = JsonConvert.SerializeObject(this.syncDates, Formatting.Indented, new JsonSerializerSettings
                {
                    DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind
                });

它将作为

发送到我的网站Api
"2021-05-11T18:10:31.740582+01:00"

然而,当它被反序列化为 ASP NET Core 控制器方法参数时,它显示为 DateTime,DateTimeKind 为 Local,但不再有任何时区信息。

11/05/2021 18:10:31

然后我将日期写入 Azure Table 存储,它将存储为 UTC,即

11/05/2021 17:10:31

当我从网络上检索数据 api 以将其显示给原始用户或其他想要查看其数据的人时,了解与用户。

  1. 我是否应该将原始时间 offset\zone 存储在单独的字段中并使用它再次转换回日期?

  2. 我根本不应该存储为 DateTime 并使用 DateTimeOffset 还是毫无意义,因为 Azure Table 存储也只会将 DTO 转换为 UTC?

要在 serialization/deserialization 期间保留偏移量,是的 - 您应该使用 DateTimeOffset 类型而不是 DateTime

关于 Azure Table 存储,虽然 SDK 支持 DateTimeOffset,但遗憾的是服务本身不支持。因此,将 DateTimeOffset 值保存到 Azure 存储将导致存储等效的 UTC DateTime,如 DateTimeOffset.UtcDateTime 属性 所示。检索时,您将有一个DateTimeOffset,其日期和时间是等效的 UTC 日期和时间,偏移量将为零。

因此,如果您确实需要跟踪偏移量,则需要将其存储在单独的列中,并在 return 时将两者合并到您的控制器中。 DateTimeOffset.ToOffset 方法是最简单的正确方法。

或者,如果您只需要正确的日期和时间部分,您可以撒谎并使用 UTC DateTime,即使该值实际上不是 UTC。只需在进入时用 DateTimeKind.Utc 调用 DateTime.SpecifyKind,在出路时用 DateTimeKind.Unspecified 调用。你会失去偏移量,但如果你不需要它那么这可以工作。