mongo日期处理工具类 - ISODate类型

背景:

最近项目中存在数据迁移的场景,将原有 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值