需求是指定时间段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);
    }
}
Constants.DATE_FORMAT="yyyy-MM-dd"
文章作者: 陆壹
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 陆壹笔记
Java java maven
喜欢就支持一下吧