关于Mongo时差的杂言碎语

 

  说起时间,这里先贴上获取时间的方法:

 1   #region 获取周、月、年时间
 2 
 3         /// <summary>
 4           ///    获取本周第一天时间
 5        /// </summary>
 6           /// <returns></returns>
 7         public DateTime GetWeekBegin()
 8         {
 9             DateTime dtWeekFirstDay =
10                 DateTime.Today.AddDays(1 - Convert.ToInt16(DateTime.Today.DayOfWeek));
11             return dtWeekFirstDay;
12         }
13 
14         /// <summary>
15         ///     获得本月第一天时间。
16         /// </summary>
17         /// <returns></returns>
18         public DateTime GetMonthBegin()
19         {
20             var dtMonthFirstDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
21             return dtMonthFirstDay;
22         }
23 
24         /// <summary>
25         ///     获得半年的时间。
26         /// </summary>
27         /// <returns></returns>
28         public  DateTime GetHalfYear()
29         {
30             DateTime dtHalfYearFirstDay = DateTime.Now.AddMonths(-6);
31             return dtHalfYearFirstDay;
32         }
33 
34         #endregion

注意:在获取本周一天时,按正常国人的习惯是以周一为第一天,外面的基本是以周日为一周的第一天。要设周一或周日为第一天就看需要而设定。

在Console.WriteLine中运行如下图:

在上图中可以看到我们所获得的时间与本地是一致的。另外再唠叨下Mongo这个数据库,以NoSql为主打方向,方式在前几年来说还是很新颖,对写惯了SQL语句的人来说又可以挑战新的数据库查询语句。Mongo的优点、原理之类的抓了个链接:http://www.cnblogs.com/hoojo/archive/2011/06/01/2066119.html感兴趣有时间的可以去看看。当然不管什么技术都有其劣势与缺陷,感兴趣的同学可上谷歌必应之类去搜索探究下。在我看来,NoSql就入夜后晕睡前那碗夜宵,吃完后浑身毛孔舒张,飘飘然,人欲成仙。但夜宵仅仅只是个小点心,当作睡前暖胃可以,当作白日正餐就不行了。当然SQL跟NoSql各有优势各有方向,刚才只是一时饿极,胡说而已。

送给大家一个网站,主要是用于将MySql语句转为Mongo数据库语句,收藏着以后或许会用得上:http://www.querymongo.com/。不想看的朋友我顺手贴下这两者的相同的查询不同的语句吧:对于MySql

1 SELECT COUNT(*) FROM BlackList WHERE create_time > "2013/4/10" and bl_id = 0

对于Mongo

db.BlackList.group({
    "initial": {
        "countstar": 0
    },
    "reduce": function(obj, prev) {
        prev.countstar++;
    },
    "cond": {
        "create_time": {
            "$gt": "2013\/4\/10"
        },
        "bl_id": 0
    }
});

是不是有点像JS的格式。

发现跑题有点远,把心收一下开始切入正题:在实际项目开发过程中,我们或多或少的都要对数据库进行各种操作,如CRUD,如数据存储云云。前几日遇见个问题,主是统计数据中日期大于某日的字段时,会发现我们的查询语句中的查询时间并非上面中图片所显示中的那样。而是比我们本地时间晚。举个例子来说,我相统计出出生日期是晚于1988年1月1日0:00:00的所有人的数量,也就是大于该日期。但返回的数据却是1987年12月31日16:00:00。这是我们的方法逻辑错了吗?非也,事实上这种代码:

1  int getTodayCount;
2             getTodayCount =
3                 _blackList.Collection.Count(Query.And(Query.EQ("bl_type", 0), Query.GTE("create_time", DateTime.Today)));

获取到的是真实的现在的时间,只不过是格林威治时间而已。不管是.NET平台还是JAVA,都是相同的问题。所以想要获得确实的北京时间需要改动如下:

 1         #region 获取周、月、年时间
 2 
 3         /// <summary>
 4         ///     获取本周第一天时间
 5         /// </summary>
 6         /// <returns></returns>
 7         public DateTime GetWeekBegin()
 8         {
 9             DateTime dtWeekFirstDay =
10                 DateTime.Today.AddDays(1 - Convert.ToInt16(DateTime.Today.DayOfWeek)).AddHours(8);
11             return dtWeekFirstDay;
12         }
13 
14         /// <summary>
15         ///     获得本月第一天时间。
16         /// </summary>
17         /// <returns></returns>
18         public DateTime GetMonthBegin()
19         {
20             var dtMonthFirstDay = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddHours(8);
21             return dtMonthFirstDay;
22         }
23 
24         /// <summary>
25         ///     获得半年的时间。
26         /// </summary>
27         /// <returns></returns>
28         public  DateTime GetHalfYear()
29         {
30             DateTime dtHalfYearFirstDay = DateTime.Now.AddMonths(-6).AddHours(8);
31             return dtHalfYearFirstDay;
32         }
33 
34         #endregion

多加个8个小时就时区挪到当前我们所在东八区。这也只是个细节的问题。

这是小弟潜水博客源近一年写的东西,希望大家能不吝斧正。谢谢大家。

posted @ 2013-04-11 12:20  Zrthas  阅读(1164)  评论(7编辑  收藏  举报