DateTimeOffset:当从LiteDb收集数据时,TZ偏移量重置为+00:00



插入时,偏移量是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,看起来并没有真正地转换为本地时间。

我建议避免在LiteDb中使用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))
);

相关内容

  • 没有找到相关文章

最新更新