年月季度以及范围的日期类

package com.cnpc.dqhse.hazardcontrol.util;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.luaj.vm2.ast.Str;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 日期范围
 * 周 - (上周四-本周三)
 * 月 - (上月21日-本月20日)
 * 季度 - (按 去年12-21 - 本年03-20 为第一季度 以此类推)
 * 年 - (去年12-21 - 本年12-20)
 *
 * @author gz
 * @date 2024-10-30
 */
public class DqDateUtils extends org.apache.commons.lang3.time.DateUtils {
    private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    /**
     * 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, Object... pattern) {
        String formatDate = null;
        if (pattern != null && pattern.length > 0) {
            formatDate = DateFormatUtils.format(date, pattern[0].toString());
        } else {
            formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
        }
        return formatDate;
    }

    /**
     * 得到当前年份字符串 格式(yyyy)
     */
    public static String getYear() {
        return formatDate(new Date(), "yyyy");
    }

    /**
     * 日期型字符串转化为日期 格式
     * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
     * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
     * "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    public static String getDate(String date, String pattern) {
        return DateFormatUtils.format(parseDate(date), pattern);
    }

    public static int dateToWeek() {
        String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        return cal.get(Calendar.DAY_OF_WEEK) - 1;
    }

    public static String previousWeek(int n, int week) {
        Calendar cal = Calendar.getInstance();
        //n为推迟的周数,1本周,-1向前推迟一周,2下周,依次类推
        cal.add(Calendar.DATE, n * 7);
        //想周几,这里就传几Calendar.MONDAY(TUESDAY...)
        cal.set(Calendar.DAY_OF_WEEK, week);
        return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
    }

    //周
    public static Map<String, String> getRangeWeeks() {
        Map<String, String> map = new HashMap<>();
        int curWeek = dateToWeek();
        if (0 < curWeek && curWeek <= 3) {
            map.put("start", previousWeek(-1, Calendar.THURSDAY));
            map.put("end", previousWeek(0, Calendar.WEDNESDAY));
        } else {
            map.put("start", previousWeek(0, Calendar.THURSDAY));
            map.put("end", previousWeek(1, Calendar.WEDNESDAY));
        }
        return map;
    }

    public static int dateToDay() {
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        return cal.get(Calendar.DAY_OF_MONTH);
    }

    public static String previousMonths(int n, int day) {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, n);
        cal.set(Calendar.DAY_OF_MONTH, day);
        return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
    }

    //月
    public static Map<String, String> getRangeMonths() {
        Map<String, String> map = new HashMap<>();
        int curDay = dateToDay();
        if (curDay <= 20) {
            map.put("start", previousMonths(-1, 21));
            map.put("end", previousMonths(0, 20));
        } else {
            map.put("start", previousMonths(0, 21));
            map.put("end", previousMonths(1, 20));
        }
        return map;
    }

    /**
     * @param nowTime   当前时间
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     * @author sunran   判断当前时间在时间区间内
     */
    public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
        if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
            return true;
        }

        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }

    public static String previousQuarters(int n, String year, String month, String day) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(parseDate(year + "-" + month + "-" + day));
        cal.add(Calendar.YEAR, n);
        return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
    }

    //季度-当前
    public static Map<String, String> getRangeQuarters() {
        Map<String, Map<String, String>> map = new HashMap<>();
        Map<String, String> one = new HashMap<>();
        one.put("start", previousQuarters(-1, getYear(), "12", "21"));
        one.put("end", previousQuarters(0, getYear(), "3", "20"));
        Map<String, String> two = new HashMap<>();
        two.put("start", previousQuarters(0, getYear(), "3", "21"));
        two.put("end", previousQuarters(0, getYear(), "6", "20"));
        Map<String, String> three = new HashMap<>();
        three.put("start", previousQuarters(0, getYear(), "6", "21"));
        three.put("end", previousQuarters(0, getYear(), "9", "20"));
        Map<String, String> four = new HashMap<>();
        four.put("start", previousQuarters(0, getYear(), "9", "21"));
        four.put("end", previousQuarters(0, getYear(), "12", "20"));
        map.put("one", one);
        map.put("two", two);
        map.put("three", three);
        map.put("four", four);
        for (String key : map.keySet()) {
            if (isEffectiveDate(new Date(), parseDate(map.get(key).get("start")), parseDate(map.get(key).get("end")))) {
                return map.get(key);
            }
        }
        Map<String, String> last = new HashMap<>();
        last.put("start", previousQuarters(0, getYear(), "12", "21"));
        last.put("end", previousQuarters(1, getYear(), "3", "20"));
        return last;
    }

    //季度
    public static List<Map<String, String>> getQueryQuarterAll() {
        List<Map<String, String>> list = new ArrayList<>();
        Map<String, String> one = new HashMap<>();
        one.put("start", previousQuarters(-1, getYear(), "12", "21"));
        one.put("end", previousQuarters(0, getYear(), "3", "20"));
        one.put("quarter", "1");
        Map<String, String> two = new HashMap<>();
        two.put("start", previousQuarters(0, getYear(), "3", "21"));
        two.put("end", previousQuarters(0, getYear(), "6", "20"));
        two.put("quarter", "2");
        Map<String, String> three = new HashMap<>();
        three.put("start", previousQuarters(0, getYear(), "6", "21"));
        three.put("end", previousQuarters(0, getYear(), "9", "20"));
        three.put("quarter", "3");
        Map<String, String> four = new HashMap<>();
        four.put("start", previousQuarters(0, getYear(), "9", "21"));
        four.put("end", previousQuarters(0, getYear(), "12", "20"));
        four.put("quarter", "4");
        list.add(one);
        list.add(two);
        list.add(three);
        list.add(four);
        return list;
    }

    public static Map<String, String> getRangeYears() {
        Map<String, String> map = new HashMap<>();
        String start = previousQuarters(-1, getYear(), "12", "21");
        String end = previousQuarters(0, getYear(), "12", "20");
        if (isEffectiveDate(new Date(), parseDate(start), parseDate(end))) {
            map.put("start", start);
            map.put("end", end);
        } else {
            map.put("start", previousQuarters(0, getYear(), "12", "21"));
            map.put("end", previousQuarters(1, getYear(), "12", "20"));
        }
        return map;
    }

    /**
     * 获取两个日期之间的所有月份 (年月)
     *
     * @param startTime
     * @param endTime
     * @return:YYYY-MM
     */
    public static List<String> getMonthBetweenDate(String startTime, String endTime) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        // 声明保存日期集合
        List<String> list = new ArrayList<String>();
        try {
            // 转化成日期类型
            Date startDate = sdf.parse(startTime);
            Date endDate = sdf.parse(endTime);

            //用Calendar 进行日期比较判断
            Calendar calendar = Calendar.getInstance();
            while (startDate.getTime() <= endDate.getTime()) {
                // 把日期添加到集合
                list.add(sdf.format(startDate));
                // 设置日期
                calendar.setTime(startDate);
                //把日期增加一天
                calendar.add(Calendar.MONTH, 1);
                // 获取增加后的日期
                startDate = calendar.getTime();
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return list;
    }

    //年
    public static List<Map<String, String>> getQueryYearAll() {
        List<Map<String, String>> list = new ArrayList<>();
        Map<String, String> rangeYears = getRangeYears();
        List<String> months = getMonthBetweenDate(rangeYears.get("start"), rangeYears.get("end"));
        for (int i = 0; i < months.size() - 1; i++) {
            Map<String, String> m = new HashMap<>();
            m.put("range", getDate(months.get(i + 1), "yyyy-MM"));
            m.put("start", months.get(i) + "-21");
            m.put("end", months.get(i + 1) + "-20");
            list.add(m);
        }
        return list;
    }


    /**
     * 根据传入的时间取月份范围
     * {start=2023-09-21, end=2023-10-20}
     */
    public static Map<String, String> getRangeMonthsByParam(String date) {
        Map<String, String> map = new HashMap<>();
        Calendar cal = Calendar.getInstance();
        cal.setTime(parseDate(date));
        int curDay = cal.get(Calendar.DAY_OF_MONTH);
        if (curDay <= 20) {
            map.put("start", previousMonthsByParam(date,-1, 21));
            map.put("end", previousMonthsByParam(date,0, 20));
        } else {
            map.put("start", previousMonthsByParam(date,0, 21));
            map.put("end", previousMonthsByParam(date,1, 20));
        }
        return map;
    }
    public static String previousMonthsByParam(String date,int n, int day) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(parseDate(date));
        cal.add(Calendar.MONTH, n);
        cal.set(Calendar.DAY_OF_MONTH, day);
        return new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
    }

    /**
     * 根据传入的范围内时间_取所有的月份和月份范围
     * [{start=2023-09-21, range=2023-10, end=2023-10-20}]
     */
    public static List<Map<String, String>> getQueryAllMonthByParam(String startTime, String endTime) {
        List<Map<String, String>> list = new ArrayList<>();
        Map<String, String> startTimeMap = getRangeMonthsByParam(startTime);
        Map<String, String> endTimeMap = getRangeMonthsByParam(endTime);
        List<String> months = getMonthBetweenDate(startTimeMap.get("start"), endTimeMap.get("end"));
        for (int i = 0; i < months.size() - 1; i++) {
            String a = months.get(i);
            Map<String, String> m = new HashMap<>();
            m.put("range", getDate(months.get(i + 1), "yyyy-MM"));
            m.put("start", months.get(i) + "-21");
            m.put("end", months.get(i + 1) + "-20");
            list.add(m);
        }
        return list;
    }

    /**
     * 根据年份,几季度,取季度范围
     * @param year
     * @param quarter
     * @return
     */
    public static Map<String, String> getRangeQuartersByYear(String year,String quarter) {
        Map<String, Map<String, String>> map = new HashMap<>();
        String year_ = year;
        Map<String, String> one = new HashMap<>();
        one.put("start", previousQuarters(-1, year_, "12", "21"));
        one.put("end", previousQuarters(0, year_, "3", "20"));
        one.put("quarter", "1");
        one.put("year", year_);
        Map<String, String> two = new HashMap<>();
        two.put("start", previousQuarters(0, year_, "3", "21"));
        two.put("end", previousQuarters(0, year_, "6", "20"));
        two.put("quarter", "2");
        two.put("year", year_);
        Map<String, String> three = new HashMap<>();
        three.put("start", previousQuarters(0, year_, "6", "21"));
        three.put("end", previousQuarters(0, year_, "9", "20"));
        three.put("quarter", "3");
        three.put("year", year_);
        Map<String, String> four = new HashMap<>();
        four.put("start", previousQuarters(0, year_, "9", "21"));
        four.put("end", previousQuarters(0, year_, "12", "20"));
        four.put("quarter", "4");
        four.put("year", year_);
        map.put("one", one);
        map.put("two", two);
        map.put("three", three);
        map.put("four", four);

        Map<String, String> last = new HashMap<>();
        if(ObjectUtils.isNotEmpty(quarter)){
            for (String key : map.keySet()) {
                if (quarter.equals(map.get(key).get("quarter"))) {
                    last =  map.get(key);
                }
            }
        }else {
            last.put("start", previousQuarters(-1, year_, "12", "21"));
            last.put("end", previousQuarters(0, year_, "12", "20"));
        }
        return last;
    }

    /**
     * 根据年参数,获取当前年的所有季度以及季度范围
     * @param year
     * @return
     */
    public static List<Map<String, String>> getQueryQuarterAllByYear(String year) {
        List<Map<String, String>> list = new ArrayList<>();
        String year_ = year;
        Map<String, String> one = new HashMap<>();
        one.put("start", previousQuarters(-1, year_, "12", "21"));
        one.put("end", previousQuarters(0, year_, "3", "20"));
        one.put("quarter", "1");
        one.put("year", year_);
        Map<String, String> two = new HashMap<>();
        two.put("start", previousQuarters(0, year_, "3", "21"));
        two.put("end", previousQuarters(0, year_, "6", "20"));
        two.put("quarter", "2");
        two.put("year", year_);
        Map<String, String> three = new HashMap<>();
        three.put("start", previousQuarters(0, year_, "6", "21"));
        three.put("end", previousQuarters(0, year_, "9", "20"));
        three.put("quarter", "3");
        three.put("year", year_);
        Map<String, String> four = new HashMap<>();
        four.put("start", previousQuarters(0, year_, "9", "21"));
        four.put("end", previousQuarters(0, year_, "12", "20"));
        four.put("quarter", "4");
        four.put("year", year_);
        list.add(one);
        list.add(two);
        list.add(three);
        list.add(four);
        return list;
    }

    public static int returnYearByTime(String date){
        Calendar cal = Calendar.getInstance();
        cal.setTime(parseDate(date));
        int curYear = cal.get(Calendar.YEAR);
        return curYear;
    }

    /**
     * 根据时间范围取——季度以及季度的范围
     * @param startTime
     * @param endTime
     * @return
     */
    public static List<Map<String, String>> getQueryQuarterAllByTime(String startTime, String endTime) {
        List<Map<String, String>> resultlist = new ArrayList<>();
        List<Map<String, String>> listMonth = getQueryAllMonthByParam(startTime,endTime); //所有的月份
        int startYear = returnYearByTime(startTime);
        int endYear = returnYearByTime(endTime);

        List<Map<String, String>> startYearList = new ArrayList<>();
        List<Map<String, String>> endYearMapList = new ArrayList<>();
        if(startYear == endYear){
            startYearList = getQueryQuarterAllByYear(startYear + "");
        }else {
           startYearList = getQueryQuarterAllByYear(startYear + "");
           endYearMapList = getQueryQuarterAllByYear(endYear + "");
        }
        if(ObjectUtils.isNotEmpty(startYearList)){
            for(Map<String, String> quarterMap : startYearList){
                for(Map<String, String> monthMap :listMonth) {
                    String startMonthTime = monthMap.get("start");
                    String endMonthTime = monthMap.get("end");
                    if (isEffectiveDate(parseDate(startMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))
                            || isEffectiveDate(parseDate(endMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))) {
                        resultlist.add(quarterMap);
                    }
                }
            }
        }
        if(ObjectUtils.isNotEmpty(endYearMapList)){
            for(Map<String, String> quarterMap : endYearMapList){
                for(Map<String, String> monthMap :listMonth) {
                    String startMonthTime = monthMap.get("start");
                    String endMonthTime = monthMap.get("end");
                    if (isEffectiveDate(parseDate(startMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))
                            || isEffectiveDate(parseDate(endMonthTime), parseDate(quarterMap.get("start")), parseDate(quarterMap.get("end")))) {
                        resultlist.add(quarterMap);
                    }
                }
            }
        }
        List<Map<String, String>> resultList_ = resultlist.stream()
                .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(f -> f.get("start")+f.get("end")))), ArrayList::new));

        return resultList_;
    }



    public static void main(String[] args) {

        //[{start=2024-02-21, range=2024-03, end=2024-03-20}, {start=2024-03-21, range=2024-04, end=2024-04-20}, {start=2024-04-21, range=2024-05, end=2024-05-20}, {start=2024-05-21, range=2024-06, end=2024-06-20}]
        System.out.println(getQueryAllMonthByParam("2024-03-10","2025-02-23"));

        //[{year=2024, start=2023-12-21, end=2024-03-20, quarter=1}, {year=2024, start=2024-03-21, end=2024-06-20, quarter=2}]
        System.out.println(getQueryQuarterAllByTime("2024-03-10","2025-02-23"));

        System.out.println(returnYearByTime("2023-09-25"));

        //{start=2023-03-21, end=2023-06-20, quarter=2}
        System.out.println(getRangeQuartersByYear("2023","2"));

        //{start=2022-12-21, end=2023-12-20}
        System.out.println(getRangeQuartersByYear("2024",""));

        System.out.println(getRangeMonthsByParam("2023-09-25")); //当前月份
        System.out.println(getQueryAllMonthByParam("2023-09-25","2025-04-23"));//所有月份
        System.out.println(getQueryYearAll());
        System.out.println(getRangeYears());
        System.out.println(getQueryQuarterAll());
        System.out.println(getRangeQuarters());
        System.out.println(getRangeMonths());
        System.out.println(getRangeWeeks());
    }
}

猜你喜欢

转载自blog.csdn.net/u011518709/article/details/143426005