从c#到mongodb正确插入DateTime

use*_*947 7 c# datetime-format mongodb

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

var time = DateTime.Now; // 03.05.2014 18:30:30

var query = new QueryDocument
{
   { "time", nowTime}
};

collection3.Insert(query);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 13

我觉得你被时区搞糊涂了.该Z字符串的结尾表明,它在UTC.当你发布这个问题时,它就在15:30 UTC之后.

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

顺便说一句,你可以通过使用UtcNow开始来更清楚.这样,你就不会试图获得"本地"时间.

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


小智 7

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

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

time = DateTime.SpecifyKind(time, DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)

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


小智 6

只需通过“BsonDateTimeOptions”属性定义日期时间的“Kind”并将其设置为本地:

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}
Run Code Online (Sandbox Code Playgroud)