实现基础需求版本:
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;
}
}
}