ITPub博客

首页 > 数据库 > 数据库开发技术 > 关于MongoDB时区问题

关于MongoDB时区问题

原创 数据库开发技术 作者:后端Q 时间:2023-11-03 00:00:00 0 删除 编辑

由于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;如有侵权,请联系管理员删除。

上一篇: CodeSmith简单用法
请登录后发表评论 登录
全部评论

注册时间:2023-01-22

  • 博文量
    1540
  • 访问量
    726034