正确的从c#插入DateTime到mongodb

本文关键字:DateTime mongodb 插入 | 更新日期: 2023-09-27 18:01:24

我尝试在MongoDB中插入本地时间

var time = DateTime.Now; // 03.05.2014 18:30:30
var query = new QueryDocument
{
   { "time", nowTime}
};
collection3.Insert(query);

但是在数据库中我看到ISODate("2014-05-03T15:30:30.170Z")
那一定是ISODate("2014-05-03T18:30:30.300Z")
请帮帮我!

正确的从c#插入DateTime到mongodb

我想你是被时区搞糊涂了。字符串末尾的Z表示它是UTC格式。当你发布这个问题时,它刚刚过了15:30 UTC。

我强烈怀疑记录的是正确的瞬间——但它被记录为没有参考特定时区的瞬间。然后,您可以转换为您稍后想要的任何时区,但记录UTC时间几乎总是正确的方法。

作为题外话,您可以通过从UtcNow开始使其更清晰。这样可以更明显地看出,您并没有试图获取"本地"时间。

查看MongoDB文档,似乎内部表示只是自Unix纪元以来的毫秒数-所以再次,没有时区或UTC与本地时间之间的偏移量的指示。如果你想存储一个值,可以转换回你看到当它被记录时的本地时间(即使你现在在不同的时区),你应该存储一个时区ID和/或UTC偏移量作为一个单独的值。这不是经常需要的,但它是一个选项。

MongoDB驱动程序正在将您的DateTime转换为UTC。

如果你不想麻烦的时区,你可以改变类型为UTC:

time = DateTime.SpecifyKind(time, DateTimeKind.Utc);

我不推荐这样做,因为数据库会存储一个"错误"的日期,但它会显示ISODate("2014-05-03T18:30:30.170Z")。

只需通过"BsonDateTimeOptions"属性定义日期时间的"Kind",并将其设置为local:

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}

可以使用:

    DateTime t = DateTime.Now;
    var update = Builders<BsonDocument>.Update
    .Set("key1", t.ToUniversalTime())
    .CurrentDate("key_updatetime");