插入时,偏移量是OK的,但是检索文档时,偏移量重置为+00:00
属性:
public DateTimeOffset CreatedOn { get; set; }
插入:
user.CreatedOn = DateTimeOffset.Now; // 01/20/2021 6:05:21 PM +05:30
col.Insert(user);
col.EnsureIndex(x => x.Username);
:
using (var db = _liteDbConnection.Create() as LiteDatabase)
{
var col = db.GetCollection<AuthUser>(USERS_COLLECTION);
return col.FindOne(x => x.UserId == userId);
}
user.CreatedOn
变为
01/20/2021 6:05:21 PM +00:00
我做错了什么吗?
从文档
根据BSON规范,
DateTime
值只存储到毫秒。所有DateTime
值在存储时转换为UTC,在检索时转换回本地时间。
看起来并没有真正的DateTimeOffset
支持。(我个人认为在检索时转换为当地时间是一个糟糕的主意,但这是一个稍微不同的问题。)此外,如果给定不正确的偏移量0,看起来并没有真正地转换为本地时间。
DateTimeOffset
,直到它真正支持(保持偏移量)。
这是因为LiteDB使用value.UtcDateTime
存储DateTimeOffset
。这是不幸的,但由于兼容性,它无法更改。但是,您可以通过创建自定义序列化器来覆盖此行为:
BsonMapper.Global.RegisterType<DateTimeOffset>
(
serialize: obj =>
{
var doc = new BsonDocument();
doc["DateTime"] = obj.DateTime.Ticks;
doc["Offset"] = obj.Offset.Ticks;
return doc;
},
deserialize: doc => new DateTimeOffset(doc["DateTime"].AsInt64, new TimeSpan(doc["Offset"].AsInt64))
);