C# CosmosDB-UTC查询的日期时间偏移问题
在CosmosDb中使用DateTimeOffset时存在问题。在提到与他们合作的指南时指出 要将本地日期时间转换为UTC,必须将偏移量作为JSON中的属性进行已知/存储,并且客户端可以使用偏移量计算UTC日期时间值 因此,我将日期以“2021-04-23T12:15:00+01:00”的格式存储在文档中。这在本地为用户查询和显示时非常有效。但是,我在对这些日期时间执行查询时遇到问题 在我的服务器上,我将执行如下查询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
"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,但显示时确实需要知道记录时的偏移量。