我有一个保存到Azure Cosmos的文档结构,如下所示:
public class CallIndex
{
public string id;
public DateTimeOffset callTime;
public string source;
}当我保存文档时,我使用以下命令,数据如下:
container.CreateItemAsync(obj, new PartitionKey(partitionKey));
/*
data:
{
"callTime": "2020-09-30T20:17:28+00:00",
"id": "352hyKL5agNtB4ic",
"source": "five9"
}
*/这工作得很好,但经过一些研究后,我意识到我们需要使用ISO8061 DateTime标准(没有偏移量)来执行一些服务器端查询。有没有办法强制CreateItemAsync函数以标准ISO8061格式序列化DateTimeOffset对象?在保存之前,我的所有callTime对象都已转换为UTC。在从数据库查询数据之后,我们使用DateTimeOffset使转换为客户机时区变得更简单。我希望我的数据在创建/替换后如下所示:
{
"callTime": "2020-09-30T20:17:28.000000Z",
"id": "352hyKL5agNtB4ic",
"source": "five9"
}这有可能吗?或者我最好改变我的结构,使用DateTime而不是DateTimeOffset
发布于 2020-10-01 09:18:48
由于这反映了JSON序列化程序的默认行为,因此您需要通过向Cosmos客户端提供您自己的custom serializer来覆盖它。实现该格式将取决于序列化程序。
我发现有很好的理由而不是来解决这个问题;使用DateTime来代替,总是使用UTC值,并且可以选择与时间适用的位置的IANA time zone名称一起使用。这保证了序列化正常工作,Cosmos喜欢它,并且能够在服务器和客户端的特定时区内正确处理datetime算法(NodaTime和date-fns库在这里有帮助)。
还要注意,DateTimeOffset在时区模糊性方面有一个基本限制:
因为单个DateTimeOffset值与其时区没有紧密耦合,所以它不能反映时区与夏令时之间的转换。当使用日期和时间算法来操作DateTimeOffset值时,这可能是有问题的。
在我看来,如果你关心你的应用程序中的时区,最好避开DateTimeOffset。
https://stackoverflow.com/questions/64147313
复制相似问题