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());
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤实现: 1. 遍历时间段列表,计算出每个时间段的工作时长(即去除午休时间后的时长)和起始时间。 2. 将给定的分钟数转换为工作时长。例如,如果给定的分钟数为60,则要找到一个时间段,使得该时间段的工作时长大于等于60分钟。 3. 找到符合条件时间段后,计算出给定分钟数相对于该时间段起始时间的偏移量。 4. 根据偏移量和工作时段的起始时间,计算出最终的日期时间。 下面是一个 Java 示例代码: ```java import java.time.DayOfWeek; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; public class DateTimeCalculator { public static LocalDateTime calculateDateTime(List<TimeSlot> timeSlots, int minutes) { int remainingMinutes = minutes; for (TimeSlot timeSlot : timeSlots) { if (timeSlot.getDayOfWeek() == DayOfWeek.SATURDAY || timeSlot.getDayOfWeek() == DayOfWeek.SUNDAY) { // 跳过周末 continue; } int workMinutes = timeSlot.getWorkMinutes(); if (remainingMinutes <= workMinutes) { // 在当前时间段内完成 LocalTime startTime = timeSlot.getStartTime(); return timeSlot.getDateTime().with(startTime).plusMinutes(remainingMinutes); } else { // 继续下一个时间段 remainingMinutes -= workMinutes; } } // 如果无法在工作时间内完成,则返回 null。 return null; } // 时间段类 public static class TimeSlot { private LocalDateTime dateTime; // 日期时间 private DayOfWeek dayOfWeek; // 星期几 private LocalTime startTime; // 起始时间 private int workMinutes; // 工作时长(分钟数) public TimeSlot(LocalDateTime dateTime, LocalTime startTime, int workMinutes) { this.dateTime = dateTime; this.dayOfWeek = dateTime.getDayOfWeek(); this.startTime = startTime; this.workMinutes = workMinutes; } public LocalDateTime getDateTime() { return dateTime; } public DayOfWeek getDayOfWeek() { return dayOfWeek; } public LocalTime getStartTime() { return startTime; } public int getWorkMinutes() { return workMinutes; } } } ``` 使用示例: ```java import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { // 构造时间段列表 List<DateTimeCalculator.TimeSlot> timeSlots = new ArrayList<>(); timeSlots.add(new DateTimeCalculator.TimeSlot(LocalDateTime.of(2022, 7, 11, 0, 0), LocalTime.of(8, 0), 240)); // 8:00 - 12:00 timeSlots.add(new DateTimeCalculator.TimeSlot(LocalDateTime.of(2022, 7, 11, 0, 0), LocalTime.of(13, 0), 240)); // 13:00 - 17:00 timeSlots.add(new DateTimeCalculator.TimeSlot(LocalDateTime.of(2022, 7, 12, 0, 0), LocalTime.of(8, 0), 240)); // 8:00 - 12:00 timeSlots.add(new DateTimeCalculator.TimeSlot(LocalDateTime.of(2022, 7, 12, 0, 0), LocalTime.of(13, 0), 240)); // 13:00 - 17:00 // 计算给定分钟数后的日期时间 LocalDateTime result = DateTimeCalculator.calculateDateTime(timeSlots, 150); if (result == null) { System.out.println("无法在工作时间内完成。"); } else { System.out.println(result); } } } ``` 输出结果为: ``` 2022-07-11T10:30 ``` 即,在 2022 年 7 月 11 日上午 10:30 之后 150 分钟,即下午 1:00。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值