Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 将日期转换回用户';s来自Azure表存储的时区_.net_Azure_Azure Table Storage_Timezone Offset_Datetimeoffset - Fatal编程技术网

.net 将日期转换回用户';s来自Azure表存储的时区

.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 {

据我所知,Azure Table Storage将所有日期时间字段存储为UTC,即Zulu时间

目前我在英国2021年5月11日18:10。这里的当前时区是英国夏令时(+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核心控制器方法参数中时,它显示为DateTime,DateTimeKind为Local,但不再具有任何时区信息

11/05/2021 18:10:31
然后我将日期写入Azure表存储,并将其存储为UTC,即

11/05/2021 17:10:31
当我从web api检索数据以将其显示给原始用户或希望查看其数据的其他人时,了解与用户相关的正确日期和时间非常重要

  • 是否应将起始时间偏移\区域存储在单独的字段中,并使用该字段再次转换回日期

  • 我是否应该根本不存储为DateTime并使用DateTimeOffset,或者这是毫无意义的,因为Azure表存储也将DTO转换为UTC


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

    关于Azure表存储,虽然SDK支持
    DateTimeOffset
    ,但遗憾的是服务本身不支持。因此,将
    DateTimeOffset
    值保存到Azure存储将导致存储等效的UTC
    DateTime
    ,如
    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层撒谎。