java给定起始时间段和所需日期号获取符合条件日期集合

需求:

每个月可能跑批,要求给定开始时间和结束时间以及每月多少号进行跑批,在该时间段内找到符合条件的日期,如果是29,30,31这几天个别月份可能没有,可以赋值为当月最后一天。

代码实现
package com.qcj;

import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
/**
 *创建人:inspur.qichangjian
 */
public class test_cal {
    public static void main(String[] args) throws Exception {
        String minDate = "2016-12-31";//三月二日会变成
        String maxDate = "2019-05-2";
        List<String> test = getMonthBetween3(minDate,maxDate,30);
        System.out.println(test);
    }

    public static List<String> getMonthBetween3(String minDate, String maxDate,int day) throws Exception {
        int flag = day;//几号
        ArrayList<String> result = new ArrayList<String>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月

        Calendar min = Calendar.getInstance();
        Calendar max = Calendar.getInstance();
        min.setTime(sdf.parse(minDate));
        max.setTime(sdf.parse(maxDate));

        Calendar curr = min;
        while (curr.before(max)) {// 当前Calendar对象 是否 晚于calendar
           // System.out.println("标志:"+flag + "curr日期:" + sdf.format(curr.getTime()) +"|是否不相等" + (curr.get(Calendar.DATE) != flag));
            if(curr.get(Calendar.DATE) != flag){//关键注释1:判断当前日期日是否和需要的日期是一天
                System.out.println("进入if......");
                //设置为这个月的最后一天
                //getMaxMonthDate(sdf.format(curr.getTime()));
                Calendar lastday = Calendar.getInstance();
                lastday.setTime(sdf.parse(getMaxMonthDate(sdf.format(curr.getTime()))));//设置时间
                curr = lastday;//关键注释二:将当前月的最后日期赋值给curr
                if(curr.get(Calendar.DATE) > flag){//关键注释三:判断修改后的时间是否和需要时间相等,如果赋值的月底时间是31 需要的是30号就重新赋值
                    curr.set(curr.get(Calendar.YEAR),curr.get(Calendar.MONTH),flag);//关键注释四:修改最后时间为需要的时间
                }
            }
            result.add(sdf.format(curr.getTime()));
            curr.add(Calendar.MONTH, 1);//加一个月
        }
        return result;
    }

    /**
     * 获取当前月份最后日期
     * @param date
     * @return
     * @throws ParseException
     */
    public static String getMaxMonthDate(String date) throws ParseException, java.text.ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf.parse(date));
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return sdf.format(calendar.getTime());
    }
}

### 使用 `MongoTemplate` 进行时间范围查询 在 Java 应用程序中,通过 `MongoTemplate` 可以方便地执行针对 MongoDB 的复杂查询操作。对于基于时间范围的查询需求,可以利用 `Criteria` 类构建查询条件,并结合 `Query` 对象完成最终的数据检索过程[^1]。 具体来说,在处理涉及日期字段的时间区间筛选时,应当注意不同环境下的日期表示差异。例如,在 Java 程序里可能存储的是类似于 `"createTime": "2018-09-13 14:04:05"` 的字符串形式;而在 MongoDB 中,则是以 ISODate 形式的文档属性存在,如 `"createTime": ISODate("2018-09-13T14:04:05.268Z")`[^2]。因此,在编写查询逻辑之前,需确保所使用的日期格式能够被双方正确解析。 下面是一个简单的例子,展示了如何使用 `MongoTemplate` 来查找创建时间介于两个指定时刻之间的记录: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import java.util.Date; import java.util.List; public class TimeRangeQueryExample { @Autowired private MongoTemplate mongoTemplate; public List<Document> findDocumentsByCreateTime(Date startDate, Date endDate) { Query query = new Query(); // 构建 Criteria 实例并设置 $gte (大于等于) $lte (小于等于) 操作符来进行时间范围匹配 query.addCriteria(Criteria.where("createTime").gte(startDate).lte(endDate)); return mongoTemplate.find(query, Document.class); } } ``` 此代码片段定义了一个名为 `findDocumentsByCreateTime` 的方法,它接受起始时间结束时间为参数,并返回满足给定时间段内所有符合条件的文档列表。这里假设集合中的每条记录都有一个名为 `createTime` 的字段用来标记其创建时间戳。 为了使上述功能正常工作,还需要考虑以下几个方面: - **日期格式转换**:如果应用程序内部采用不同于 ISO8601 或者 Unix timestamp 的自定义格式来表达日期,则需要先将其转化为适合存入/读取 MongoDB 的标准格式。 - **时区问题**:由于服务器端与客户端可能存在不同的默认时区设定,所以在涉及到跨地域部署的应用场景下特别要注意这一点,以免造成不必要的误差。 - **性能优化**:当面对海量数据集时,建议为经常作为过滤依据的关键列建立索引来加速查询速度[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值