Java使用MongoTemplate操作MangoDB,实现根据时间等条件组合查询,解决ISODate的问题

Java和Mongo中的Date比较

Java中的Date:“createTime” : “2018-09-13 14:04:05”),
MongoDB中的Date: “createTime” : ISODate(“2018-09-13T14:04:05.268Z”),

MongoDB中的日期格式 是 UTC 通用标准,格式为"yyyy-MM-dd HH![:mm:](https://www.webpagefx.com/tools/emoji-cheat-sheet/graphics/emojis/mm.png)ss.000'Z'"
该时间比中国北京时间晚了8个小时,即·ISODate("2018-09-13T14:04:05.268Z")相当于北京时间2018-09-13 06:04:05.268
因为mongo中的Date类型以UTC(Coordinated Universal Time)存储,就等于GMT(格林尼治标准时)时间。而系统时间使用的是GMT+0800时间,两者正好相差8个小时。

MongoDB条件表达式

表达式含义
$gt>
$gte>=
$eq=
$ne!=
$lt<
$lte<=
$inin(后面的值为bson对象数组)
$ninnot in(后面的值为bson对象数组)

Maven依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

实现方式:

String starttime = String.valueOf(params.get("starttime"));
String endtime = String.valueOf(params.get("endtime"));
Query query = new Query();
Criteria criteria = new Criteria();
//设置查询条件
criteria.and("companyId").is(datum.getCompanyId());
criteria.and("createUser").is(datum.getUserId());
criteria.and("type").is(3);
//设置查询时间范围
criteria.and("createTime").gte(DateUtils.dateToISODate(startTime)).lte(DateUtils.dateToISODate(endTime));
query.addCriteria(criteria);
List<CustomerFormDataEntity> customerFormDataEntities = mongoTemplate.find(query, CustomerFormDataEntity.class);

mongo中查询实现方式:

// Requires official MongoShell 3.6+
db = db.getSiblingDB("im_customer");
db.getCollection("customer_form_data").find(
    { 
        "type" : 3.0, 
        "createUser" : 6264.0, 
        "companyId" : 97.0, 
        "createTime" : { 
            "$gte" : ISODate("2022-05-24T00:00:00.000+0000"), 
            "$lte" : ISODate("2022-05-24T23:59:59.000+0000")
        }
    }
);

ISODate转换方法

package net.commchina.im.common.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.SimpleTimeZone;

/**
 * <p>
 * DateUtils
 *
 * @program: 
 * @description:
 * @author: Mr.Nanke
 * @create: 2022-05-25 19:16
 **/
public class DateUtils {
    /** * mongo 日期查询isodate * @param dateStr * @return */
    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) {
            //
        }
        return ret;
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值