Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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
C# CosmosDB-UTC查询的日期时间偏移问题_C#_Json_Linq_Azure Cosmosdb_Utc - Fatal编程技术网

C# CosmosDB-UTC查询的日期时间偏移问题

C# CosmosDB-UTC查询的日期时间偏移问题,c#,json,linq,azure-cosmosdb,utc,C#,Json,Linq,Azure Cosmosdb,Utc,在CosmosDb中使用DateTimeOffset时存在问题。在提到与他们合作的指南时指出 要将本地日期时间转换为UTC,必须将偏移量作为JSON中的属性进行已知/存储,并且客户端可以使用偏移量计算UTC日期时间值 因此,我将日期以“2021-04-23T12:15:00+01:00”的格式存储在文档中。这在本地为用户查询和显示时非常有效。但是,我在对这些日期时间执行查询时遇到问题 在我的服务器上,我将执行如下查询 "SELECT * FROM c WHERE c.expiresAt

在CosmosDb中使用DateTimeOffset时存在问题。在提到与他们合作的指南时指出

要将本地日期时间转换为UTC,必须将偏移量作为JSON中的属性进行已知/存储,并且客户端可以使用偏移量计算UTC日期时间值

因此,我将日期以“2021-04-23T12:15:00+01:00”的格式存储在文档中。这在本地为用户查询和显示时非常有效。但是,我在对这些日期时间执行查询时遇到问题

在我的服务器上,我将执行如下查询

"SELECT * FROM c WHERE c.expiresAt <= \"2021-04-23T11:58:05\""
   var jsonSerializerSettings = new JsonSerializerSettings
        {
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
            DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ"
        };
Linq查询

.Where(x => x.ExpiresAt.UtcDateTime <= DateTime.UtcNow)
我肯定是误会了,对吧

注意:我尝试使用SQL查询而不是像这样使用linq

"SELECT * FROM c WHERE c.expiresAt <= \"2021-04-23T11:58:05\""
   var jsonSerializerSettings = new JsonSerializerSettings
        {
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
            DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ"
        };
“从c中选择*,其中c.expiresAt另一个建议使用Z缩写存储它。
我试过了,它似乎大致按照我希望的方式工作,但并不完美。所有日期现在都存储为日期时间值,并附加Z。然后使用DateTimeOffset DTO,它将在客户端上适当地转换该值。
但是必须更改它的序列化设置,就像这样

"SELECT * FROM c WHERE c.expiresAt <= \"2021-04-23T11:58:05\""
   var jsonSerializerSettings = new JsonSerializerSettings
        {
            DateFormatHandling = DateFormatHandling.IsoDateFormat,
            DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ"
        };
然后我添加了在创建DocumentClient时

new DocumentClient(serviceEndpoint, authKey, serializerSettings: jsonSerializerSettings);

我唯一的问题是,我有需要从服务器发送的电子邮件,其中包含时间。这些时间是不正确的,因为服务器不知道如何将它们转换为客户端本地时间。

根据我的经验,这种组合可以在.NET上实现Cosmos和datetimes的快乐:

  • 模型日期和时间为ISO 8601中建议的值
  • 使用
    DateTime
    .NET类型,而不是
    DateTimeOffset
  • 确保完整日期时间以精确格式序列化
    yyyy-MM-ddTHH:MM:ss.fffffff z
  • 始终存储UTC值,而不是本地时间
  • 如果值表示某个特定时区内发生的事件,请将值存储在该值旁边。然后在显示给用户之前使用该值进行转换
  • 使用.NETSDK3和
    System.Text.Json
    中基于流的方法()直接控制序列化,并使用可按预期工作的默认方法
  • 避免LINQ,而是使用

不是答案,但请看一下MongoDB处理此问题的各种方式:查询时需要使用UTC,但显示时确实需要知道记录时的偏移量。