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