从c#到mongodb正确插入DateTime

时间:2014-05-03 15:32:51

标签: c# mongodb datetime-format

我尝试在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")
请帮帮我!

4 个答案:

答案 0 :(得分:10)

我认为你对时区感到困惑。字符串末尾的Z表示它在UTC中。当你发布这个问题时,它就在15:30 UTC之后。

我强烈怀疑正在记录正确的时间 - 但它是在没有参考特定时区的情况下及时记录的。然后,您可以将转换到以后想要的任何时区,但记录UTC时间几乎总是正确的方法。

顺便说一句,您可以使用UtcNow开始更清楚。这样一来,你就不会想要获得一个本地的"时间。

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

答案 1 :(得分:7)

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

如果您不想打扰时区,可以将类型更改为UTC:

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

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

答案 2 :(得分:4)

只需通过“BsonDateTimeOptions”属性定义DateTime的“Kind”并将其设置为local:

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

答案 3 :(得分:2)

它可以用于:

    DateTime t = DateTime.Now;

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