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