微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将日期从 Azure 表存储转换回用户的时区

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

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

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

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

它将作为

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

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

11/05/2021 18:10:31

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

11/05/2021 17:10:31

当我从 Web api 检索数据以将其显示给原始用户或其他想要查看其数据的人时,了解与用户相关的正确日期和时间非常重要。

  1. 我是否应该将原始 Time offset\zone 存储在一个单独的字段中并使用它再次将 Date 转换回来?

  2. 我是不是应该完全不存储为 DateTime 并使用 DateTimeOffset ,还是因为 Azure 表存储也会将 DTO 转换为 UTC 而毫无意义?

解决方法

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

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

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

或者,如果您只需要正确的日期和时间部分,您可以稍微使用一下并使用 UTC DateTime,即使该值实际上不是 UTC。只需在输入时使用 DateTime.SpecifyKind 调用 DateTimeKind.Utc,在输出时使用 DateTimeKind.Unspecified。您将失去偏移量,但如果您无论如何都不需要它,那么这可以工作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。