(Java)让方法输入开始日期、开始时间、结束日期、结束时间后按日期拆分时间段并通过List返回。

 实现基础需求版本:


import java.util.ArrayList;
import java.util.List;

public class Test3 {
    public static void main(String[] args) throws Exception {//调用案例
        String fromDateStr = "2021-10-04", fromTimeStr = "08:30";
        String toDateStr = "2021-10-08", toTimeStr = "17:30";
        List<String[]> retList = splitDateTimeByDate(fromDateStr, fromTimeStr, toDateStr, toTimeStr);
        for (String[] arr : retList) {//reList
            for (String s : arr) {
                System.out.print(s + "\t");//arr[] = {"date","fromTime","toTime"}
            }
            System.out.println();
        }
    }

    public static List<String[]> splitDateTimeByDate(String fromDateStr, String fromTimeStr, String toDateStr, String toTimeStr) throws Exception {
        List<String[]> retList = new ArrayList<>();

        if (fromDateStr.toString() == toDateStr.toString()) {//如果是同一天,可以不用看,这是为后面优化准备的
            String[] arr = new String[3];
            arr[0] = fromDateStr;
            arr[1] = fromTimeStr;
            arr[2] = toTimeStr;

            retList.add(arr);
        } else {//如果不是同一天
            String yearMonth = fromDateStr.substring(0, fromDateStr.length() - 2);//分割fromDateStr,只要"yyyy-mm-"
            String dayFrom = fromDateStr.substring(fromDateStr.length() - 2);//分割fromDateStr,只要"dd"
            String dayTo = toDateStr.substring(toDateStr.length() - 2);//分割toDateStr,只要"dd"
            int from = Integer.parseInt(dayFrom);//String类型转为int类型
            int to = Integer.parseInt(dayTo);//String类型转为int类型
            int day = to - from;//相隔多少天

            for (int i = 0; i < day + 1; i++) {//从04这一天开始遍历,i代表增加的天数
                String[] arr = new String[3];
                arr[0] = yearMonth + String.format("%02d", from + i);//String.format("多少位字符串",int类型数据),将一位的int数据转为两位的String字符串

                if (i == 0) {//如果是04这一天
                    arr[1] = fromTimeStr;//开始时间
                } else {
                    arr[1] = "00:00";//不是04这一天的开始时间
                }

                if (i == day) {//如果是08这一天
                    arr[2] = toTimeStr;//结束时间
                } else {
                    arr[2] = "23:59";//不是08这一天的结束时间
                }
                retList.add(arr);//将arr数组放入retList中
            }

        }
        return retList;
    }
}

运行结果:

优化2.0版本:

在前面思路的基础上,增加了String转Date转long计算日期的思路,确保年月的差异也能实现计算


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

public class Test3 {
    public static void main(String[] args) throws Exception {//调用案例
        String fromDateStr = "2021-09-30", fromTimeStr = "08:30";
        String toDateStr = "2021-10-08", toTimeStr = "17:30";
        List<String[]> retList = splitDateTimeByDate01(fromDateStr, fromTimeStr, toDateStr, toTimeStr);
        for (String[] arr : retList) {//reList
            for (String s : arr) {
                System.out.print(s + "\t");//arr[] = {"date","fromTime","toTime"}
            }
            System.out.println();
        }
    }


    public static List<String[]> splitDateTimeByDate01(String fromDateStr, String fromTimeStr, String toDateStr, String toTimeStr) throws Exception {
        List<String[]> retList = new ArrayList<>();

        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");//转换Date类型和String类型的前提,格式化时间
        Calendar cal = Calendar.getInstance();//这里cal默认是当前日期,
        Date fromDate = sim.parse(fromDateStr);//String类型转为Date类型
        Date toDate = sim.parse(toDateStr);//String类型转为Date类型
        cal.setTime(fromDate);//将cal的时间改为fromDate的时间
        long fromTime = cal.getTimeInMillis();//获取用长整型表示的日历的当前时间
        cal.setTime(toDate);//将cal的时间改为toDate的时间
        long toTime = cal.getTimeInMillis();//获取用长整型表示的日历的当前时间
        long index = fromTime;//做个指标

        while (true) {
            String[] arr = new String[3];
            arr[0] = sim.format(index);//存储指标代表的那一天
            if (index == fromTime) {//指标指向第一天
                arr[1] = fromTimeStr;
                arr[2] = "23:59";
            } else if (index == toTime) {//指标指向最后一天
                arr[1] = "00:00";
                arr[2] = toTimeStr;
                retList.add(arr);
                //因为这里面有个“break;”,不会再运行后面的“retList.add(arr);”,所以要在“break;”前面增加一条,确保最后一天的String数组加入retList
                break;
            } else{//指标指向除了第一天和最后一天的那一天
                arr[1] = "00:00";
                arr[2] = "23:59";
            }
            retList.add(arr);//将String数组加入retList
            index += (1000 * 3600 * 24);//指标增加一天
        }

        return retList;
    }
}

测试数据:

from:"2021-09-30""8:30"

to: "2021-10-08""17:30"

from:"2020-12-30""8:30"

to: "2021-01-08""17:30"

优化2.0Plus版本:

拓展了业务,增加输入、判断功能。


import java.text.SimpleDateFormat;
import java.util.*;

public class Test3 {
    public static void main(String[] args) throws Exception {//调用案例
//        String fromDateStr = "2020-12-30", fromTimeStr = "08:30";
//        String toDateStr = "2021-01-08", toTimeStr = "17:30";

        Scanner sc = new Scanner(System.in);
        String fromDateStr;
        String fromTimeStr;
        String toDateStr;
        String toTimeStr;
        while (true) {
            System.out.println("请输入开始日期(格式:yyyy-MM-dd):");
            fromDateStr = sc.nextLine();
            if (!dateStringIsValid(fromDateStr,"yyyy-MM-dd")){//判断日期格式
                System.out.println("您输入的日期不附和格式!请重新输入!");
                continue;
            }

            System.out.println("请输入开始时间(格式:HH:mm):");
            fromTimeStr = sc.nextLine();
            if (!dateStringIsValid(fromTimeStr,"HH:mm")){//判断日期格式
                System.out.println("您输入的时间不附和格式!请重新输入!");
                continue;
            }

            System.out.println("请输入结束日期(格式:yyyy-MM-dd):");
            toDateStr = sc.nextLine();
            if (!dateStringIsValid(toDateStr,"yyyy-MM-dd")){//判断日期格式
                System.out.println("您输入的日期不附和格式!请重新输入!");
                continue;
            }

            System.out.println("请输入结束时间(格式:HH:mm):");
            toTimeStr = sc.nextLine();
            if (!dateStringIsValid(toTimeStr,"HH:mm")){//判断日期格式
                System.out.println("您输入的时间不附和格式!请重新输入!");
                continue;
            }


            if(dateStringTolong(fromDateStr,"yyyy-MM-dd") > dateStringTolong(toDateStr,"yyyy-MM-dd") ){
                System.out.println("您输入的开始日期大于结束日期!请重新输入!");
                continue;
            }

            if (fromDateStr.equals(toDateStr) && dateStringTolong(fromTimeStr,"HH:mm")>dateStringTolong(toTimeStr,"HH:mm")){
                System.out.println("同一天的开始时间不能大于结束时间!请重新输入");
                continue;
            }

            break;
        }


        List<String[]> retList = splitDateTimeByDate01(fromDateStr, fromTimeStr, toDateStr, toTimeStr);
        for (String[] arr : retList) {//reList
            for (String s : arr) {
                System.out.print(s + "\t");//arr[] = {"date","fromTime","toTime"}
            }
            System.out.println();
        }
    }

    
    public static List<String[]> splitDateTimeByDate01(String fromDateStr, String fromTimeStr, String toDateStr, String toTimeStr) throws Exception {
        List<String[]> retList = new ArrayList<>();
        SimpleDateFormat sim = new SimpleDateFormat("yyyy-MM-dd");
        long fromTime = dateStringTolong(fromDateStr,"yyyy-MM-dd");//获取用长整型表示的日历的当前时间
        long toTime = dateStringTolong(toDateStr,"yyyy-MM-dd");//获取用长整型表示的日历的当前时间
        long index = fromTime;//做个指标

        while (true) {
            String[] arr = new String[3];
            arr[0] = sim.format(index);//存储指标代表的那一天
            if (fromTime == toTime){//如果同一天
                arr[1] = fromTimeStr;
                arr[2] = toTimeStr;
                retList.add(arr);
                break;
            }

            if (index == fromTime) {//指标指向第一天
                arr[1] = fromTimeStr;
                arr[2] = "23:59";
            } else if (index == toTime) {//指标指向最后一天
                arr[1] = "00:00";
                arr[2] = toTimeStr;
                retList.add(arr);
                //因为这里面有个“break;”,不会再运行后面的“retList.add(arr);”,所以要在“break;”前面增加一条,确保最后一天的String数组加入retList
                break;
            } else{//指标指向除了第一天和最后一天的那一天
                arr[1] = "00:00";
                arr[2] = "23:59";
            }
            retList.add(arr);//将String数组加入retList
            index += (1000 * 3600 * 24);//指标增加一天
        }

        return retList;
    }

    public static long dateStringTolong(String dateStr,String type) throws Exception {//将String类型的日期转为long类型
        SimpleDateFormat sim = new SimpleDateFormat(type);//转换Date类型和String类型的前提,格式化时间
        Calendar cal = Calendar.getInstance();//这里cal默认是当前日期,
        Date date = sim.parse(dateStr);//String类型转为Date类型
        cal.setTime(date);//将cal的时间改为fromDate的时间
        long time = cal.getTimeInMillis();//获取用长整型表示的日历的当前时间
        return time;
    }

    public static boolean dateStringIsValid(String dateStr,String type){//判断日期、时间是否符合格式
        SimpleDateFormat sim = new SimpleDateFormat(type);
        Date date = null;
        try {
            date = sim.parse(dateStr);
            return dateStr.equals(sim.format(date));
        }catch (Exception e){
            return false;
        }
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊崽正在输入中

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值