DateTimeOffset:从 LiteDb 集合中获取数据时,TZ 偏移量重置为 +00:00

DateTimeOffset: TZ Offset is reset to +00:00 when fetching data from LiteDb collection

插入时,偏移量是可以的,但是在检索文档时,它会重置为+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

我是不是做错了什么?

来自documentation

Following the BSON specification, DateTime values are stored only up to the miliseconds. All DateTime values are converted to UTC on storage and converted back to local time on retrieval.

看起来没有实际的 DateTimeOffset 支持。 (我个人认为在检索时转换为本地时间是一个糟糕的主意,但这是一个稍微不同的问题。)此外,看起来它不是 really 正确转换为本地时间,给定不正确的偏移量 0.

我建议避免将 DateTimeOffset 与 LiteDb 一起使用,直到它 真正 受支持(保持偏移量)。

发生这种情况是因为 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))
);