能够做到输入一个日期范围,返回一个需要的日期范围。如果具体需求不一致,可以参考做需修改。
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.time.LocalDate;
public class DateRangeDTO {
/**
* 开始时间范围
*/
private LocalDate startTime;
/**
* 结束时间范围
*/
private LocalDate endTime;
public LocalDate getStartTime() {
return startTime;
}
public void setStartTime(LocalDate startTime) {
this.startTime = startTime;
}
public LocalDate getEndTime() {
return endTime;
}
public void setEndTime(LocalDate endTime) {
this.endTime = endTime;
}
@Override
public String toString() {
return "DateRangeDTO{" +
"startTime=" + startTime +
", endTime=" + endTime +
'}';
}
}
对比的是上个月的数据
| 说明 | 传入 | 返回 |
|---|---|---|
| 对比一整个月 | 2023.06.01-2023.06.30 | 2023.05.01-2023.05.31 |
| 对比上月同期 | 2023.06.01-2023.06.07 | 2023.05.01-2023.05.07 |
| 对比前一天 | 2023.06.01-2023.06.01 | 2023.05.31-2023.05.31 |
/**
* 获取环比时间范围--月份为准
*
* @param startTime 开始时间范围
* @param endTime 结束时间范围
* @return
*/
public static DateRangeDTO getQoQDateRangeMonth(LocalDate startTime, LocalDate endTime) {
DateRangeDTO dateRangeDTO = new DateRangeDTO();
// 是否同一天
if (startTime.isEqual(endTime)) {
dateRangeDTO.setStartTime(startTime.plusDays(-1));
dateRangeDTO.setEndTime(startTime.plusDays(-1));
return dateRangeDTO;
}
// 提取年份
int startYear = startTime.getYear();
int endYear = endTime.getYear();
int differYear = endYear - startYear + 1;
// 每个月份满日期数
int day = LocalDate.of(startYear, 3, 1).plusDays(-1).getDayOfMonth();
List<Integer> days = Arrays.asList(31, day, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
// 提取月份
int startMonth = startTime.getMonthValue();
int endMonth = endTime.getMonthValue();
int differMonth = endMonth - startMonth + 1;
// 提取天数
int startDay = startTime.getDayOfMonth();
int endDay = endTime.getDayOfMonth();
int differDay = endDay - startDay + 1;
// 返回的时间范围
LocalDate startTimeBefore = startTime.plusMonths(-differMonth);
LocalDate endTimeBefore = endTime.plusMonths(-differMonth);
// 是否是当月最后一天
if (Objects.equals(endDay, days.get(endMonth - 1))) {
endTimeBefore = endTimeBefore.with(TemporalAdjusters.lastDayOfMonth());
}
dateRangeDTO.setStartTime(startTimeBefore);
dateRangeDTO.setEndTime(endTimeBefore);
return dateRangeDTO;
}
对比的是前几天的数据,但是如果选择是月份满了就是对比一个月
| 说明 | 传入 | 返回 |
|---|---|---|
| 对比的是上个一样的天数 | 2023.06.10-2023.06.14 | 2023.06.05-2023.06.09, |
| 对比的是上个一样的天数 | 2023.06.10-2023.06.20 | 2023.05.30-2023.06.09 |
| 对比月份 | 2023.06.01-2023.06.30 | 2023.05.01-2023.05.31 |
/**
* 获取环比时间范围--日期为准
* @param startTime 开始时间范围
* @param endTime 结束时间范围
* @return
*/
public static DateRangeDTO getQoQDateRangeDay(LocalDate startTime, LocalDate endTime) {
// 提取年份
int startYear = startTime.getYear();
int endYear = endTime.getYear();
int differYear = endYear - startYear + 1;
// 每个月份满日期数
int day = LocalDate.of(startYear, 3, 1).plusDays(-1).getDayOfMonth();
List<Integer> days = Arrays.asList(31, day, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
// 提取月份
int startMonth = startTime.getMonthValue();
int endMonth = endTime.getMonthValue();
int differMonth = endMonth - startMonth + 1;
// 提取天数
int startDay = startTime.getDayOfMonth();
int endDay = endTime.getDayOfMonth();
int differDay = endDay - startDay + 1;
// 返回的时间范围
LocalDate startTimeBefore;
LocalDate endTimeBefore = startTime.plusDays(-1);
// 判断开始范围是第一天 和 结束范围都为当月最后一天
boolean aBoolean = Objects.equals(startDay, 1) && Objects.equals(endDay, days.get(endMonth - 1));
// 传递的时间范围在同一个月内
if (Objects.equals(differMonth, 1) && Objects.equals(differYear, 1)) {
// 【开始范围是第一天 和 结束范围都为最后一天】 就为 上个月 【反之】 反推天数
startTimeBefore = aBoolean ? startTime.plusMonths(-1) : startTime.plusDays(-differDay);
} else {
// 【月份日期都是满的】 就推月份 【反之】 反推天数
startTimeBefore = aBoolean ? startTime.plusMonths(-differMonth) : startTime.plusDays(-differDay);
}
DateRangeDTO dateRangeDTO = new DateRangeDTO();
dateRangeDTO.setStartTime(startTimeBefore);
dateRangeDTO.setEndTime(endTimeBefore);
return dateRangeDTO;
}