好久没更新了,太忙了,好几个项目,新旧项目齐上阵,加需求 、改需求、改bug,怎么都改不完呐。经常就是在好几个项目里打转,一下改这个,一下忙那个,一下说这个很急先做这个,一下又说那个很急先赶那个,心都静不下来,分身乏术。几个项目切来切去,每天都是头痛欲裂的一天呐。
获取开始、结束日期之间的所有日期
有下面两种方式,都一样的,看自己的日期格式是LocalDate 还是 DateTime
/**
* 根据开始、结束时间获取它们之间的所有日期
*/
public static List<String> rangeDay(DateTime start,DateTime end){
List<String> dates = new LinkedList<>();
DateTime currentDate = start;
while (!currentDate.isAfter(end)) {
dates.add(DateUtil.format(currentDate,"M月d日"));
currentDate = currentDate.offset(DateField.DAY_OF_MONTH,1);
}
return dates;
}
/**
* 根据开始、结束日期获取它们之间的所有日期
*/
public static List<String> rangeDay(LocalDate start, LocalDate end){
List<String> dates = new LinkedList<>();
LocalDate currentDate = start;
while (!currentDate.isAfter(end)) {
dates.add(LocalDateTimeUtil.format(currentDate,"M月d日"));
currentDate = currentDate.plusDays(1);
}
return dates;
}
获取开始、结束时间之间的所有时间段(每隔x分钟一个时段)
因为是每隔15分钟为一个时段,所以开始、结束时间的分钟数必须是15的倍数,比如:00分、15分、30分、45分
这样,不然拿不到。
这个就看自己需求了,你要每隔1分钟一个时段那就无所谓开始、结束时间的分钟数是什么。还有比如每隔5分钟、10分钟一个时段,那这个开始、结束时间的分钟数必须是5或10的倍数才行。
/**
* 获取两个时间之间的所有时间段(每15分钟一个时间段)
* @param startTimeStr
* @param endTimeStr
*/
public static List<String> getTimePeriodStr(String startTimeStr,String endTimeStr,String formatter){
LocalDateTime startTime = LocalDateTimeUtil.parse(startTimeStr, "yyyy-MM-dd HH:mm:ss");
LocalDateTime endTime = LocalDateTimeUtil.parse(endTimeStr, "yyyy-MM-dd HH:mm:ss");
return getTimePeriodStr(startTime,endTime,formatter);
}
/**
* 获取两个时间之间的所有时间段(每15分钟一个时间段)
*/
public static List<String> getTimePeriodStr(LocalDateTime startTime,LocalDateTime endTime,String formatter){
List<String> result = new LinkedList<>();
List<LocalDateTime> dataList = getTimePeriod(startTime,endTime);
for (LocalDateTime time : dataList) {
result.add(time.format(DateTimeFormatter.ofPattern(formatter)));
}
return result;
}
/**
* 获取两个时间之间的所有时间段(每15分钟一个时间段)
*/
public static List<LocalDateTime> getTimePeriod(LocalDateTime startTime,LocalDateTime endTime){
List<LocalDateTime> result = new LinkedList<>();
LocalDateTime currentTime = startTime;
while (!currentTime.isAfter(endTime)) {
// 如果需要改成每x分钟一个时间段,那就把15改成x
if (currentTime.getMinute() % 15 == 0) {
//if (currentTime.getMinute() % x == 0) {
result.add(currentTime);
}
currentTime = currentTime.plusMinutes(15); // 这里也是把加15分钟改成加x分钟
//currentTime = currentTime.plusMinutes(x);
}
return result;
}
获取连续的时间段(每x分钟一个时间段)
这里和上面那个获取所有时间段是同样的道理,因为是每15分钟一个时间段,所以时间段列表必须是15的倍数,比如:00分、15分、30分、45分
这样,不然拿不到。如果需要改成每x分钟一个时间段,那么时间段列表的分钟数也需要改成x的倍数。
/**
* 获取连续的时间段(每隔15分钟),连续时段进行合并,并且如果连续时段跨班次则需要进行拆分
* @param dateList 时间段列表
* @return 连续的时间段
*/
public static Map<String,List<LocalDateTime>> findContinuousTimeStr(List<String> dateList) {
String format = "yyyy-MM-dd HH:mm:ss";
List<LocalDateTime> dateTimeList = dateList.stream().distinct().map(t -> LocalDateTimeUtil.parse(t, format)).collect(Collectors.toList());
return findContinuousTime(dateTimeList);
}
/**
* 获取连续的时间段(每隔15分钟),连续时段进行合并,并且如果连续时段跨班次则需要进行拆分
* @param dateTimeList 时间段列表
* @return 连续的时间段
*/
public static Map<String,List<LocalDateTime>> findContinuousTime(List<LocalDateTime> dateTimeList) {
dateTimeList = dateTimeList.stream().distinct().sorted().collect(Collectors.toList());
LocalDateTime start = dateTimeList.get(0);
LocalDateTime end = dateTimeList.get(0);
Map<String,List<LocalDateTime>> continuousTime = new LinkedHashMap<>();
List<LocalDateTime> list = new LinkedList<>(); // 每个连续时段的所有时段列表
for (int i = 1; i <= dateTimeList.size(); i++) {
LocalDateTime current = dateTimeList.get(i - 1);
list.add(current);
// 最后一个元素
if (i == dateTimeList.size()){
if (end.isEqual(current)) {
String key = start + "#" + end;
if (!continuousTime.containsKey(key)){
continuousTime.put(key,list);
}
}
break;
}
// 计算15分钟间隔的连续时间段(如果需要每x分钟一个时间段,那就把15改成x)
if (dateTimeList.get(i).isEqual(current.plusMinutes(15))) {
end = dateTimeList.get(i);
} else {
String key = start + "#" + end;
if (!continuousTime.containsKey(key)){
continuousTime.put(key,list);
}
list = new LinkedList<>();
start = dateTimeList.get(i);
end = dateTimeList.get(i);
}
}
return continuousTime;
}
public static void main(String[] args) {
List<String> dateList = new ArrayList<>();
dateList.add("2024-05-20 07:00:00");
dateList.add("2024-05-20 07:45:00");
dateList.add("2024-05-20 08:30:00");
dateList.add("2024-05-20 07:15:00");
dateList.add("2024-05-20 07:30:00");
dateList.add("2024-05-20 08:15:00");
dateList.add("2024-05-20 08:15:00");
dateList.add("2024-05-20 09:15:00");
dateList.add("2024-05-20 09:15:00");
dateList.add("2024-05-20 08:45:00");
dateList.add("2024-05-20 09:45:00");
dateList.add("2024-05-20 07:00:00");
Map<String, List<LocalDateTime>> continuousTimeStr = findContinuousTimeStr(dateList);
for (String key : continuousTimeStr.keySet()) {
List<LocalDateTime> values = continuousTimeStr.get(key);
System.out.println("时段:" + key.replace("#"," 至 "));
for (LocalDateTime value : values) {
System.out.println("\t" + value);
}
}
}