描述:
最近有小伙伴问:我输入开始时间(2021-08-11)和结束时间(2022-08-11),然后计算出每个月的起始时间
思路:
我的思路比较简单,先计算出时间范围内的每一天,在根据每天的日期计算出所在月的起始时间,最后去下重。
上DEMO:
/**
* 获取指定日期所在月的第一天
* @param date 日期
* @return 所在月的第一天
*/
public static Date getFirstOfMonth(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
return calendar.getTime();
}
/**
* 获取指定日期所在月的第最后一天
* @param date 日期
* @return 最后一天
*/
public static Date getLastOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
return calendar.getTime();
}
/**
* 获取指定日期内的每一天
* @param startDate
* @param endDate
* @return
*/
private static List<String> getTwoDaysDayDes(String startDate, String endDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> dateList = new ArrayList<>();
try {
Date dateOne = sdf.parse(startDate);
Date dateTwo = sdf.parse(endDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(dateOne);
dateList.add(startDate);
while (dateTwo.after(calendar.getTime())) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
dateList.add(sdf.format(calendar.getTime()));
}
} catch (Exception e) {
e.printStackTrace();
}
return dateList;
}
public static void main(String[] args) throws ParseException {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String str = StringUtils.join(getTwoDaysDayDes("2022-02-05","2022-08-04"),",");
String[] split = str.split(",");
List<Object> list = new LinkedList<>();
for (int i = 0, len = split.length; i < len; i++) {
list.add(Collections.singleton(df.format(getFirstOfMonth(df.parse(split[i])))));
list.add(Collections.singleton(df.format(getLastOfMonth(df.parse(split[i])))));
}
for (int i = 0; i < list.stream().distinct().collect(Collectors.toList()).size(); i++) {
System.out.println(list.stream().distinct().collect(Collectors.toList()).get(i));
}
}