Java日期工具获取指定月份周明细和获取两个月份间隔月份明细

获取指定月份周明细

package com.ruoyi.ad.util;


import java.text.SimpleDateFormat;
import java.time.*;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author: 谢辉
 * @date: 2021/4/14
 * @email: xieh_mail@163.com
 * @description: 获取每个月有几周,并且每周的开始日期和结束日期
 * 国内都是以周一开始,注:即使第一天是周末,也算一周
 * @modifiedBy:
 * @version: 1.0
 */
public class AdDateUtils {

    /**
     * 获取指定月份有几周,每周的开始日期和结束日期
     *
     * @param yearMonth
     * @return
     */
    public static Map<Integer, WeekData> weeks(YearMonth yearMonth) {
        // 获取指定月份的第一天
        LocalDate start = LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth());
        // 获取指定月份的最后一天
        LocalDate end = LocalDate.now().with(yearMonth).with(TemporalAdjusters.lastDayOfMonth());

        Map<Integer, WeekData> map = Stream.iterate(start, localDate -> localDate.plusDays(1l))
                .limit(ChronoUnit.DAYS.between(start, end) + 1)
                // DayOfWeek.MONDAY 这里是指定周一(MONDAY)为一周的开始
                .collect(Collectors.groupingBy(localDate -> localDate.get(WeekFields.of(DayOfWeek.MONDAY, 1).weekOfMonth()),
                        Collectors.collectingAndThen(Collectors.toList(), WeekData::new)));
        return map;

    }

    /**
     * 获取指定时期的后面月份的第一天开始时间
     *
     * @param startDate 开始时间
     * @param month     第几个月
     * @return
     */
    public static Date getMonthDate(Date startDate, int month) {
        LocalDateTime localDateTime = startDate.toInstant()
                .atZone(ZoneId.systemDefault())
                .toLocalDateTime().plusMonths(month);
        Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
        return date;
    }


    public static class WeekData {
        // 一周的开始时间
        private LocalDate start;
        // 一周的结束时间
        private LocalDate end;

        public WeekData(List<LocalDate> localDates) {
            this.start = localDates.get(0);
            this.end = localDates.get(localDates.size() - 1);
        }

        @Override
        public String toString() {
            return this.start + "~" + this.end;
        }
    }

    public static void main(String[] args) throws Exception {
        System.out.println(weeks(YearMonth.of(2021, 4)));

        String targetStr = YearMonth.now().toString() + "-01";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = getMonthDate(sdf.parse(targetStr), 2);
        System.out.println("后2个月的时间:" + sdf.format(date));

    }
}

 

获取两个月份间隔月份明细

package com.demo;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * 计算两个月份相隔的明细
 * @author XH
 *
 */
public class TestDate {

    public static int getDay(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DATE);
    }

    /** * 返回日期的月份,1-12,即yyyy-MM-dd中的MM * * @param date * @return */
    public static int getMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.MONTH) + 1;
    }

    /** * 返回日期的年,即yyyy-MM-dd中的yyyy * * @param date * Date * @return int */
    public static int getYear(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
    }

    public static int getDaysOfMonth(int year, int month) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(year, month - 1, 1);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }


    public static int calDiffMonth(String startDate,String endDate){
        int result=0;
        try {
            SimpleDateFormat sfd=new SimpleDateFormat("yyyy-MM");
            Date start = sfd.parse(startDate);
            Date end = sfd.parse(endDate);
            int startYear=getYear(start);
            int startMonth=getMonth(start);
            int startDay=getDay(start);
            int endYear=getYear(end);
            int endMonth=getMonth(end);
            int endDay=getDay(end);
            if (startDay>endDay){ //1月17 大于 2月28
                if (endDay==getDaysOfMonth(getYear(new Date()),2)){   //也满足一月
                    result=(endYear-startYear)*12+endMonth-startMonth;
                }else{
                    result=(endYear-startYear)*12+endMonth-startMonth-1;
                }
            }else{
                result=(endYear-startYear)*12+endMonth-startMonth;
            }

        } catch (ParseException e) {
            e.printStackTrace();
        }

        return result;
    }

    public static List<String> getBetweenDateByMonth(String startDate,String endDate){
        List<String> results =  new ArrayList<String>();
        // 判断两个月份的间隔数量
        int count = calDiffMonth(startDate,endDate);
        // 如果两个日期相等
        if(count == 0) {
            results.add(startDate);
            results.add(endDate);
            return results;
        }
        if(count > 0) {
            YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM"));
            results.add(startDate);
            for (int i = 1; i <= count; i++) {
                // 参数-1 是获取下个月的月份
                YearMonth nextMonths = now.minusMonths(-i);
                results.add(nextMonths.toString());
            }
            return results;
        }
        if(count < 0) {
            YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM"));
            results.add(startDate);
            count = Math.abs(count);
            for (int i = 1; i <= count; i++) {
                // 参数1 是获取上个月的月份
                YearMonth nextMonths = now.minusMonths(i);
                results.add(nextMonths.toString());
            }
             Collections.reverse(results);
             return results;
            //return results;
        }
        return results;
    }

    
    
    public static void main(String[] args) {
        List<String> betweenDateByMonth = getBetweenDateByMonth("2020-04", "2020-08");
        System.out.println(betweenDateByMonth.toString());

    }

}

 

补充:

    /**
     * 根据指定日期开始获取指定数量的下几个月
     * 注:包含入参的月份
     * @param startDate 开始日期(yyyy-MM)
     * @param num 指定数量
     * @return
     */
    public static List<String> getNextMonthByNum(String startDate,int num){
        YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM"));
        List<String> results =  new ArrayList<String>();
        results.add(now.toString());
        if(num <= 0){
            return results;
        }
        for(int i = 1; i <= num; i++){
            YearMonth nextMonths = now.minusMonths(-i);
            results.add(nextMonths.toString());
        }
        return results;
    }

 

posted @ 2021-04-16 13:04  图图小淘气_real  阅读(930)  评论(0编辑  收藏  举报