首页 > 数据库 > 数据库开发技术 > 关于MongoDB时区问题
由于MongoDb存储时间按照UTC时间存储的,其官方驱动MongoDB.driver存储时间的时候将本地时间转换为了utc时间,但读取的时候是返回的是utc时间。一个非常直观的体现是时间类型字段存储后和再读入的是不一致的。
一个简单的示例如下:
table.InsertOne(new MyClass()
{
Time = DateTime.Now,
});
foreach (var data in table.Find(_=> true).ToList())
{
Console.WriteLine(data.Time);
}
运行这段代码就会发现时间读取出来和写入的相差8个小时(北京时间)。
格林威治时间
格林威治子午线上的地方时,或零时区(中时区)的区时叫做格林威治时间,也叫世界时。(更多详细的概念不说了,这里我们不需要。) 比如我们中国是东八区,北京时间是(GMT+08:00)
获得本地与格林威治时间的时差:new Date().getTimezoneOffset(),单位为分钟。
已知格林威治时间,换算本地正确时间
本地时间 = 格林威治时间 - 时差
已知本地时间,换算对应格林威治时间:
格林威治时间 = 本地时间 + 时差
已知本地时间,换算其他时区的时间
因为时区间的差异是以小时为单位的。所以算出0时区的时间后,再减去或加上相应的小时即可(东N区便+N小时,西N区便-N小时)。为了方便计算,东N区记做正数,西N区记做负数,即:
目标时区时间 = 本地时间 + 时差 + 时区间隔
官方给出的修改方法是:
在时间类型属性字段上显式标注是否为本地时间
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime SomeDateProperty {get;set;}
还有一种方式就是把时间统一事先转成时间戳,字段使用long类型 存储,这样就可以规避这个问题。
原文作者:后端Q;如有侵权,请联系管理员删除。