.net 将日期转换回用户';s来自Azure表存储的时区
据我所知,Azure Table Storage将所有日期时间字段存储为UTC,即Zulu时间 目前我在英国2021年5月11日18:10。这里的当前时区是英国夏令时(+1:00) 如果我使用RoundtripKind选项将其序列化为JSON.net 将日期转换回用户';s来自Azure表存储的时区,.net,azure,azure-table-storage,timezone-offset,datetimeoffset,.net,Azure,Azure Table Storage,Timezone Offset,Datetimeoffset,据我所知,Azure Table Storage将所有日期时间字段存储为UTC,即Zulu时间 目前我在英国2021年5月11日18:10。这里的当前时区是英国夏令时(+1:00) 如果我使用RoundtripKind选项将其序列化为JSON string json = JsonConvert.SerializeObject(this.syncDates, Formatting.Indented, new JsonSerializerSettings {
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核心控制器方法参数中时,它显示为DateTime,DateTimeKind为Local,但不再具有任何时区信息
11/05/2021 18:10:31
然后我将日期写入Azure表存储,并将其存储为UTC,即
11/05/2021 17:10:31
当我从web api检索数据以将其显示给原始用户或希望查看其数据的其他人时,了解与用户相关的正确日期和时间非常重要
要在序列化/反序列化期间保留偏移量,请选择“是”-您应该使用
DateTimeOffset
类型,而不是DateTime
关于Azure表存储,虽然SDK支持DateTimeOffset
,但遗憾的是服务本身不支持。因此,将DateTimeOffset
值保存到Azure存储将导致存储等效的UTCDateTime
,如DateTimeOffset
的.UtcDateTime
属性所示。检索时,您将有一个日期时间偏移量,其日期和时间为等效的UTC日期和时间,偏移量将为零
因此,如果您确实需要跟踪偏移量,则需要将其存储在单独的列中,并在返回时将两者合并到控制器中。DateTimeOffset.ToOffset
方法是正确执行此操作的最简单方法
或者,如果您只需要日期和时间部分是正确的,您可以撒一点谎,使用UTC
DateTime
,即使该值实际上不是UTC。只需调用DateTime.SpecifyKind
,输入时使用DateTimeKind.Utc
,输出时使用DateTimeKind.Unspecified
。您将释放偏移量,但如果您无论如何都不需要它,那么这可以工作。您使用的是哪个客户端SDK?Microsoft.Azure.Cosmos.Table 1.0.8请尝试一下Azure.Data.Tables。这是最新的客户端,目前正在预览中,但不久将发布。在这方面,两个SDK具有相同的行为。我已经在ASPNET控制器中切换到DTO,并将在接下来的几天内按照您的建议“在控制器中合并这两个”。我还添加了另一种方法,这并不完全是推荐的,但可以完成工作-取决于你的要求。:-)你的另一种撒小谎的方法正是我正在做的,但我的同事说服我说“这是一种让火箭从天上掉下来的谎言”D这样做的后果是,稍后其他人可能会读取表存储,而不理解您在API层撒谎。