背景:
最近项目中存在数据迁移的场景,将原有 MongoDB 中的数据迁移到 MySQL中。其中有一个条件,是迁移某个时间之后的数据。但 MongoDB中的时间格式 UTC,国际标准时间。
知识储备
时间格式2020-03-13T15:00:00.000Z中的T和Z分别表示什么?
T表示分隔符,Z表示的是UTC。
UTC:世界标准时间,在标准时间上加上8小时,即东八区时间,也就是北京时间。
处理工具类
package com.fresher.migration.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.SimpleTimeZone;
public class ISODateUtil {
public static Date dateToISODate(String dateStr){
//T代表后面跟着时间,Z代表UTC统一时间
Date date = formatD(dateStr);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
String isoDate = format.format(date);
try {
return format.parse(isoDate);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/** 时间格式(yyyy-MM-dd HH:mm:ss) */
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
public static Date formatD(String dateStr){
return formatD(dateStr,DATE_TIME_PATTERN);
}
public static Date formatD(String dateStr , String format) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Date ret = null ;
try {
ret = simpleDateFormat.parse(dateStr) ;
} catch (ParseException e) {
e.printStackTrace();
}
return ret;
}
}
使用案例:
package com.fresher.migration.shop.component.impl;
import com.fresher.migration.shop.component.BrandComponent;
import com.fresher.migration.shop.entity.mongo.ArticleDO;
import com.fresher.migration.shop.entity.mongo.GameDO;
import com.fresher.migration.shop.entity.mongo.ShopDO;
import com.fresher.migration.util.ISODateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* 品牌组件
*
* @author fresher
* @date 2020/12/21 上午10:50
*/
@Component
public class BrandComponentImpl implements BrandComponent {
/**
* mongoTemplate
*/
@Autowired
private MongoTemplate mongoTemplate;
@Override
public List<ShopDO> findNeedTransferBrandList() {
//1.获取未被删除所有品牌信息
List<ShopDO> unDeletedBrandList = getAllUnDeletedBrandList();
//2.过滤掉没有活动的品牌
return filterNoGameBrands(unDeletedBrandList);
}
/**
* 过滤没有活动的,否则组装活动信息
*/
private List<ShopDO> filterNoGameBrands(List<ShopDO> unDeletedBrandList) {
List<ShopDO> needTransferShopList = new ArrayList<>();
if (CollectionUtils.isEmpty(unDeletedBrandList)) {
return new ArrayList<>();
}
for (ShopDO shopDO : unDeletedBrandList) {
if (Objects.isNull(shopDO)) {
continue;
}
//获取该品牌最新的活动信息
GameDO gameDO = findGameByBrandId(shopDO.get_id());
if (gameDO != null) {
//获取活动对应的article
if (!StringUtils.isEmpty(gameDO.getDetailArticleId())) {
ArticleDO articleDO = findArticleById(gameDO.getDetailArticleId());
if (articleDO != null) {
gameDO.setArticleDO(articleDO);
}
}
shopDO.setGameDO(gameDO);
needTransferShopList.add(shopDO);
}
}
unDeletedBrandList = null;
return needTransferShopList;
}
/**
* 根据id查询article
*/
private ArticleDO findArticleById(String detailArticleId) {
Criteria criteria = Criteria.where("_id").is(detailArticleId).and("createTime").gte(ISODateUtil.dateToISODate("2020-03-01 00:00:00"));
List<ArticleDO> articleDOList = mongoTemplate.find(Query.query(criteria).with(Sort.by(Sort.Direction.DESC, "createTime")).limit(1), ArticleDO.class);
if (CollectionUtils.isEmpty(articleDOList)) {
return new ArticleDO();
}
return articleDOList.get(0);
}
/**
* 根据品牌ID查询最新活动信息
*/
private GameDO findGameByBrandId(String brandId) {
Criteria criteria = Criteria.where("shop._id").is(brandId).and("createTime").gte(ISODateUtil.dateToISODate("2020-03-01 00:00:00"));
List<GameDO> gameList = mongoTemplate.find(Query.query(criteria).with(Sort.by(Sort.Direction.DESC, "createTime")).limit(1), GameDO.class);
if (CollectionUtils.isEmpty(gameList)) {
return null;
} else {
return gameList.get(0);
}
}
/**
* 获取未被删除所有品牌信息
*/
private List<ShopDO> getAllUnDeletedBrandList() {
SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd" );
Criteria criteria = Criteria.where("type").is("pinpai").and("createTime").gte(ISODateUtil.dateToISODate("2020-03-01 00:00:00")).and("deleted").ne(true);
List<ShopDO> shopDOList = mongoTemplate.find(Query.query(criteria), ShopDO.class);
return shopDOList;
}
}