我有一个将日期时间存储为UTC的Mongo C#实现。
MongoDB.Bson.Serialization.Options.DateTimeSerializationOptions options =
MongoDB.Bson.Serialization.Options.DateTimeSerializationOptions.UtcInstance;
var serializer =
new MongoDB.Bson.Serialization.Serializers.DateTimeSerializer(options);
MongoDB.Bson.Serialization.BsonSerializer.RegisterSerializer(
typeof(DateTime),
serializer);
我还需要将用户本地时区与UTC一起存储。
解释一下,我有两个类似的属性
DateTime WorkItemToCompleteBy{get; set;}
[BsonDateTimeOptions(Kind = DateTimeKind.Unspecified)]
DateTime WorkItemToCompleteByLocal{get; set;}
我想将“澳大利亚/美洲/印度/其他时间”存储在“本地”属性中,并将各自的UTC值存储在另一属性中。由于正在处理数十个时区,因此我有将UTC转换为所需时区并将其存储在WorkItemToCompleteByLocal属性中的代码。
我希望Mongo可以“原样”存储此值并将其返回给我。问题是Mongo始终将其存储为ISODate并将其值转换为Utc版本。
解释。
如果UTC为0730小时,并且我将布里斯类时间计算为1730Hours并将其设置为WorkitemToCompleteByLocal,
他们被保存为
"WorkItemToCompleteBy" : ISODate("2013-06-05T07:30:00Z"),
"WorkItemToCompleteByLocal" : ISODate("2013-06-05T12:00:00Z"),
Mongo将提供的时间解释为本地时间,服务器在印度,并将其转换为相当于1200小时的UTC。虽然它的值可以追溯到1730(IST Albeit),但它违背了我的意图,使我无法在Mongo上运行任何基于本地时间的查询。我没有主意。感谢您提供任何帮助以无需修改即可存储WorkItemToCompleteByLocal日期“原样”
最佳答案
新版本的C#驱动程序=>
public class MyMongoDBDateTimeSerializer : DateTimeSerializer
{
// MongoDB returns datetime as DateTimeKind.Utc, which cann't be used in our timezone conversion logic
// We overwrite it to be DateTimeKind.Unspecified
public override DateTime Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var obj = base.Deserialize(context, args);
return new DateTime(obj.Ticks, DateTimeKind.Unspecified);
}
// MongoDB stores all datetime as Utc, any datetime value DateTimeKind is not DateTimeKind.Utc, will be converted to Utc first
// We overwrite it to be DateTimeKind.Utc, becasue we want to preserve the raw value
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, DateTime value)
{
var utcValue = new DateTime(value.Ticks, DateTimeKind.Utc);
base.Serialize(context, args, utcValue);
}
}
关于c# - 在Mongo中存储Utc和本地日期时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16901393/