将日期从 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 以将其显示给原始用户或其他想要查看其数据的人时,了解与用户。
我是否应该将原始时间 offset\zone 存储在单独的字段中并使用它再次转换回日期?
我根本不应该存储为 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
调用。你会失去偏移量,但如果你不需要它那么这可以工作。
据我了解,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 以将其显示给原始用户或其他想要查看其数据的人时,了解与用户。
我是否应该将原始时间 offset\zone 存储在单独的字段中并使用它再次转换回日期?
我根本不应该存储为 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
调用。你会失去偏移量,但如果你不需要它那么这可以工作。