Java根据指定时间段按日月周时间范围分组
需求是指定时间段2022-08-31至2022-09-30,按日月周分组显示
-
按日分组
日期 2022-08-31 ..... 2022-09-30 -
按月分组
日期 2022-08-31至2022-08-31 -
按周分组 2022-08-31(周三)至2022-09-04(周日)
日期 2022-08-31至2022-09-04
代码实现
- 引入依赖包
<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.11.1</version>
</dependency>
- DateRange.java
import java.io.Serializable;
/**
* @author lzw
* @description DateRange
* @date 2022/9/23
*/
public class DateRange implements Serializable {
private static final long serialVersionUID = 8072214700909413688L;
private String begin;
private String end;
public String getBegin() {
return begin;
}
public void setBegin(String begin) {
this.begin = begin;
}
public String getEnd() {
return end;
}
public void setEnd(String end) {
this.end = end;
}
@Override
public String toString() {
return "DateRange{" +
"begin='" + begin + '\'' +
", end='" + end + '\'' +
'}';
}
}
- DateTimeUtil.java 工具类代码
package com.lc.util;
import com.lc.constants.Constants;
import com.lc.demo.DateRange;
import org.joda.time.DateTime;
import org.joda.time.Period;
import org.joda.time.PeriodType;
import java.util.ArrayList;
import java.util.List;
/**
* @author lzw
* @description DateTimeUtil
* @date 2022/7/29
*/
public class DateTimeUtil {
private DateTimeUtil() {
}
/**
* 根据指定时间范围转换为周范围分组列表
*
* @param startDate
* @param endDate
* @return
*/
public static List<DateRange> convertWeekList(DateTime startDate, DateTime endDate) {
List<DateRange> weekRangeList = new ArrayList<>();
//转换成joda-time的对象
DateTime firstDay = startDate.dayOfWeek().withMinimumValue();
DateTime lastDay = endDate.dayOfWeek().withMaximumValue();
//计算两日期间的区间天数
Period p = new Period(firstDay, lastDay, PeriodType.days());
int days = p.getDays();
if (days > 0) {
int weekLength = 7;
for (int i = 0; i < days; i = i + weekLength) {
DateTime monday = firstDay.plusDays(i);
DateTime sunday = firstDay.plusDays(i + 6);
addDateRangeList(startDate, endDate, weekRangeList, i, monday, sunday);
}
} else {
DateRange dateRange = new DateRange();
dateRange.setBegin(startDate.toString(Constants.DATE_FORMAT));
dateRange.setEnd(endDate.toString(Constants.DATE_FORMAT));
weekRangeList.add(dateRange);
}
return weekRangeList;
}
/**
* 根据指定时间范围转换为月范围分组列表
* @param startDate
* @param endDate
* @return
*/
public static List<DateRange> convertMonthList(DateTime startDate, DateTime endDate) {
List<DateRange> monthRangeList = new ArrayList<>();
Period p = new Period(startDate, endDate, PeriodType.months());
int months = p.getMonths();
if (months > 0) {
for (int i = 0; i <= months; i++) {
DateTime monthBegin = startDate.plusMonths(i);
DateTime monthEnd = monthBegin.dayOfMonth().withMaximumValue();
addDateRangeList(startDate, endDate, monthRangeList, i, monthBegin, monthEnd);
}
} else {
DateRange dateRange = new DateRange();
dateRange.setBegin(startDate.toString(Constants.DATE_FORMAT));
dateRange.setEnd(endDate.toString(Constants.DATE_FORMAT));
monthRangeList.add(dateRange);
}
return monthRangeList;
}
/**
* 根据指定时间范围转换为日范围分组列表
* @param startDate
* @param endDate
* @return
*/
public static List<DateRange> convertDayList(DateTime startDate, DateTime endDate) {
List<DateRange> dayRangeList = new ArrayList<>();
//计算两日期间的区间天数
Period p = new Period(startDate, endDate, PeriodType.days());
int days = p.getDays();
if (days > 0) {
for (int i = 0; i <= days; i++) {
DateTime plusDays = startDate.plusDays(i);
addDateRangeList(startDate, endDate, dayRangeList, i, plusDays, plusDays);
}
} else {
DateRange dateRange = new DateRange();
dateRange.setBegin(startDate.toString(Constants.DATE_FORMAT));
dateRange.setEnd(endDate.toString(Constants.DATE_FORMAT));
dayRangeList.add(dateRange);
}
return dayRangeList;
}
/**
* 添加数据到DateRangeList
* @param startDate
* @param endDate
* @param dayRangeList
* @param index
* @param begin
* @param end
*/
private static void addDateRangeList(DateTime startDate, DateTime endDate, List<DateRange> dayRangeList, int index, DateTime begin, DateTime end) {
if (index == 0 && startDate.isAfter(begin)) {
begin = startDate;
}
if (endDate.isBefore(end)) {
end = endDate;
}
DateRange dateRange = new DateRange();
dateRange.setBegin(begin.toString(Constants.DATE_FORMAT));
dateRange.setEnd(end.toString(Constants.DATE_FORMAT));
dayRangeList.add(dateRange);
}
}
版权声明:
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自
陆壹笔记!
喜欢就支持一下吧