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;
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM