关于mongodb根据时间统计(日、月、年),数据库ISODate与当前差了8小时时区的解决方案

1,问题:       

在做数据统计时,有需求根据时间做统计,然而数据库里存的是ISODate格式,之前单纯的通过$dateToString的方式做了个时间格式转换,后来发现是有问题的,由于ISODate的时区和我们本地时区差了8小时,也就是说明明是同一天的会被当成2天来统计

例:2019-04-26 9点=ISO格式  2019-04-26 1点

        2019-04-26 5点=ISO格式  2019-04-25  21点

这样明明是同一天的数据就变成了2天的数据了,

   后来在网上找到了解决方法

2:方案代码

 在group统计之前先对日期数据进行8小时时区的增加(使用$add方法),然后再根据转义后的时间进行统计

例:

数据库写法(已测试):{$project:{ "newDate":{ $add : ["$createDate",  28800000]} }}//加8小时

java后台DBObject 写法(已测试):

//处理ISODATE
String parseIso="{\n"+
                  "\"$project\": {\n"+
                      "\"newDate\": {\n"+
                        "\"$add\": [\"$happenTime\", 28800000]\n"+
                      "}\n"+
                      "\"alertLevel\":\"$alertLevel\""+
                    "}\n"
                "}";
DBObject parseIsoProject = (DBObject) JSON.parse(parseIso);

java后台 AggregationOperation的ProjectionOperation写法(未测试):

Aggregation.project().andExpression("add(createTime," + 8 * 60 * 60 * 1000 + ")").as("newDate");

3:思路

其实很简单,就是在统计之前对时区先做好处理,让他变成当前时间即可,部分未测代码也是网上找来的,可根据实际情况调试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值