原因
之前使用Navicat看到时间存在时区问题,所以在后台代码都增加了8小时,但后来使用metabse时发现类似工具都支持修改时区,例如Robo 3T等。所以产生了此需求
步骤
- 修改原来的代码,把所有的增加/减少8小时,时区差的相关代码都移除
- 重启服务
- 重启时使用接口调用修改时间的方法,确保新数据不受影响的同时,老数据全部处理
- 关键代码
@Override
public void init() {
// 构建聚合查询的结果总数
Criteria criteria = new Criteria();
Aggregation countAggregation = newAggregation(
match(criteria),
group().count().as("total_count")
);
AggregationResults<Document> results = mongoTemplate.aggregate(countAggregation, "flow_tracking", Document.class);
if (results.getMappedResults().size() <= 0){
return;
}
Integer resultsSize = (Integer) results.getMappedResults().get(0).get("total_count");
/**
* 如果不存在空的数据,则结束方法
*/
if (resultsSize > 0) {
/**
* 根据结果总数分页处理
*/
Integer cycleNum = (resultsSize / 10000) + 1;
for (Integer i = 0; i < cycleNum; i++) {
Integer skipNum = i==0?0:i*10000;
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "flow_tracking");
Aggregation aggregation = newAggregation(
match(criteria),
project("add_time","start_time","end_time"),
skip(skipNum),
limit(10000)
);
AggregationResults<Document> documents = mongoTemplate.aggregate(aggregation, "flow_tracking", Document.class);
List<Pair<Query, Update>> updateList = new LinkedList<>();
documents.getMappedResults().forEach(data -> {
Query query = new Query(new Criteria("_id").is(data.get("_id")));
Update update = new Update();
update.set("add_time", new Timestamp(data.getDate("add_time").getTime()).toLocalDateTime().minusHours(8));
update.set("start_time", new Timestamp(data.getDate("start_time").getTime()).toLocalDateTime().minusHours(8));
update.set("end_time", new Timestamp(data.getDate("end_time").getTime()).toLocalDateTime().minusHours(8));
Pair<Query, Update> updatePair = Pair.of(query, update);
updateList.add(updatePair);
});
operations.updateMulti(updateList);
operations.execute();
}
}
}
后续
查询时使用Robo3T设置时区,Navicat查看是仍会显示比正常时间少8小时