按照指定週期分隔日期區間的工具類

package com.iss.gtreasury.financing.common.util;

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;


/**
 * 分割時間工具類
 * 按照
 * 指定月份週期
 * 將
 * 兩日期 拆分區間
 *
 */
public class SplitDateUtil {
      /*  public static String getDateStr(Date date) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(date);
       }*/
    /**
     * 返回時間節點
     *
     * @param startDate 開始時間
     * @param endDate   結束時間
     * @param cycle     週期
     * @return
     */
    public static List<Date> getDateNode(Date startDate, Date endDate, int cycle) {
        Calendar start = getCalendar(startDate);
        //月份差
        int monthPoor = getMonthPoor(startDate, endDate);
        //分組次數
        int count = monthPoor / cycle;
        //如果不能被整除
        if (monthPoor % cycle != 0) {
            count += 1;
        }
        List<Date> list = new ArrayList<Date>();
        list.add(startDate);
        for (int i = 0; i < count; i++) {
            //遞增週期月
            start.add(Calendar.MONTH, +cycle);
            startDate = start.getTime();
            //如果開始日期是在結束日期之後
            boolean flag = startDate.after(endDate);
            if (flag) {
                list.add(endDate);
            } else {
                list.add(startDate);
            }
        }
        return list;
    }

    /**
     * 返回一個日曆的實例
     *
     * @param date
     * @return
     */
    private static Calendar getCalendar(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }

    /**
     * 計算日期之間的月份差
     *
     * @param startDate
     * @param endDate
     * @return
     */
    private static int getMonthPoor(Date startDate, Date endDate) {
        Calendar startCalendar = getCalendar(startDate);
        Calendar endCalendar = getCalendar(endDate);
        //年份差
        int yearPoor = endCalendar.get(Calendar.YEAR) - startCalendar.get(Calendar.YEAR);
        //月份差
        int monthPoor = yearPoor * 12 + (endCalendar.get(Calendar.MONTH) - startCalendar.get(Calendar.MONTH));
        //日差判斷TODO
        if (endCalendar.get(Calendar.DAY_OF_MONTH) < endCalendar.get(Calendar.DAY_OF_MONTH)) {
            monthPoor -= 1;
        }
        return monthPoor;
    }

    /**
     * 計算日期之間的天數差
     */
    public static Long getDayPoor(Date startDate, Date endDate) {
        LocalDate startDateLocal = dateToLocalDate(startDate);
        LocalDate endDateLocal = dateToLocalDate(endDate);
        return endDateLocal.toEpochDay() - startDateLocal.toEpochDay();
    }

    /**
     * Date轉LocalDate
     *
     * @param date
     * @return
     */
    private static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }
}




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章