如何解决将日期从 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 检索数据以将其显示给原始用户或其他想要查看其数据的人时,了解与用户相关的正确日期和时间非常重要。
-
我是否应该将原始 Time offset\zone 存储在一个单独的字段中并使用它再次将 Date 转换回来?
-
我是不是应该完全不存储为 DateTime 并使用 DateTimeOffset ,还是因为 Azure 表存储也会将 DTO 转换为 UTC 而毫无意义?
解决方法
要在序列化/反序列化期间保留偏移量,是的 - 您应该使用 DateTimeOffset
类型而不是 DateTime
。
关于 Azure 表存储,虽然 SDK 支持 DateTimeOffset
,但遗憾的是服务本身不支持。因此,将 DateTimeOffset
值保存到 Azure 存储将导致存储等效的 UTC DateTime
,如 .UtcDateTime
的 DateTimeOffset
属性所给定的。检索时,您将有一个 DateTimeOffset
,其日期和时间是等效的 UTC 日期和时间,偏移量为零。
因此,如果您确实需要跟踪偏移量,则需要将其存储在单独的列中,并在返回时将两者合并到您的控制器中。 DateTimeOffset.ToOffset
方法是正确执行此操作的最简单方法。
或者,如果您只需要正确的日期和时间部分,您可以稍微使用一下并使用 UTC DateTime
,即使该值实际上不是 UTC。只需在输入时使用 DateTime.SpecifyKind
调用 DateTimeKind.Utc
,在输出时使用 DateTimeKind.Unspecified
。您将失去偏移量,但如果您无论如何都不需要它,那么这可以工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。