要求:
A)按从周一到周日计算为一周。周六日为单独一周
B)跨月的,每月的1号在周内,就按该月计算第一周,
例如2022年8月29日到2022年9月4日在一周里,此周算做2022年9月第一周。
含有1号的为第一周
C)跨年的,按不同年份拆分周数,例如2022年12月26日到2023年1月1日在一周里,则计算2022年12月26日到2022年12月31日为2022年12月第5周,2023年1月1日为2023年1月第一周。
public static void main(String[] args) throws ParseException {
List<String> strings = doDateSplit("2023-01-01", "2023-12-31");
System.out.println(strings);
}
// 将时间按照星期分割
public static List<String> doDateSplit(String startDate, String endDate) throws ParseException {
List<String> resultlist = new ArrayList<String>();
List<String> listWeekOrMonth = new ArrayList<String>();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
DateFormat olddateFormat = new SimpleDateFormat("yyyy-MM-dd");
DateFormat newdateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date sDate = dateFormat.parse(startDate);
Calendar sCalendar = Calendar.getInstance();
sCalendar.setFirstDayOfWeek(Calendar.MONDAY);// 设置一周的第一天从星期几开始
sCalendar.setTime(sDate);
Date eDate = dateFormat.parse(endDate);
Calendar eCalendar = Calendar.getInstance();
eCalendar.setFirstDayOfWeek(Calendar.MONDAY);
eCalendar.setTime(eDate);
boolean bool = true; // 添加第一天
while (sCalendar.getTime().getTime() < eCalendar.getTime().getTime()) {
int week1 = sCalendar.get(Calendar.DAY_OF_WEEK) - 1;// 周几
if (bool || week1 == 0 || week1 == 1) {
if (week1 == 0) {// 周日
sCalendar.set(Calendar.HOUR_OF_DAY, 23);
sCalendar.set(Calendar.MINUTE, 59);
sCalendar.set(Calendar.SECOND, 59);
String time = newdateFormat.format(sCalendar.getTime());
listWeekOrMonth.add(time);
} else {
sCalendar.set(Calendar.HOUR_OF_DAY, 0);
sCalendar.set(Calendar.MINUTE, 0);
sCalendar.set(Calendar.SECOND, 0);
String time = dateFormat.format(sCalendar.getTime());
listWeekOrMonth.add(time);
}
bool = false;
}
sCalendar.add(Calendar.DAY_OF_MONTH, 1);// 加一天
}
Calendar newCalendar = eCalendar;
listWeekOrMonth.add(olddateFormat.format(newCalendar.getTime()));
if (listWeekOrMonth.size() % 2 != 0) {
// 1月1号是个周日
Date pDate = dateFormat.parse(startDate);
Calendar pCalendar = Calendar.getInstance();
pCalendar.setFirstDayOfWeek(Calendar.MONDAY);
pCalendar.setTime(pDate);
int week1 = pCalendar.get(Calendar.DAY_OF_WEEK) - 1;
if (week1 == 0) {// 一年的第一天是周日
String format = dateFormat.format(pCalendar.getTime());
listWeekOrMonth.add(0,format);
} else {
listWeekOrMonth.add(dateFormat.format(eCalendar.getTime()));
}
}
for (int g = 0; g < listWeekOrMonth.size(); g += 2) {
String startTime = listWeekOrMonth.get(g);
String endTime = listWeekOrMonth.get(g + 1);
String time = startTime + "@" + endTime;
resultlist.add(time);
}
return resultlist;
}
运行结果
== [2023-01-01@2023-01-01, 2023-01-02@2023-01-08, 2023-01-09@2023-01-15, 2023-01-16@2023-01-22, 2023-01-23@2023-01-29, 2023-01-30@2023-02-05, 2023-02-06@2023-02-12, 2023-02-13@2023-02-19, 2023-02-20@2023-02-26, 2023-02-27@2023-03-05, 2023-03-06@2023-03-12, 2023-03-13@2023-03-19, 2023-03-20@2023-03-26, 2023-03-27@2023-04-02, 2023-04-03@2023-04-09, 2023-04-10@2023-04-16, 2023-04-17@2023-04-23, 2023-04-24@2023-04-30, 2023-05-01@2023-05-07, 2023-05-08@2023-05-14, 2023-05-15@2023-05-21, 2023-05-22@2023-05-28, 2023-05-29@2023-06-04, 2023-06-05@2023-06-11, 2023-06-12@2023-06-18, 2023-06-19@2023-06-25, 2023-06-26@2023-07-02, 2023-07-03@2023-07-09, 2023-07-10@2023-07-16, 2023-07-17@2023-07-23, 2023-07-24@2023-07-30, 2023-07-31@2023-08-06, 2023-08-07@2023-08-13, 2023-08-14@2023-08-20, 2023-08-21@2023-08-27, 2023-08-28@2023-09-03, 2023-09-04@2023-09-10, 2023-09-11@2023-09-17, 2023-09-18@2023-09-24, 2023-09-25@2023-10-01, 2023-10-02@2023-10-08, 2023-10-09@2023-10-15, 2023-10-16@2023-10-22, 2023-10-23@2023-10-29, 2023-10-30@2023-11-05, 2023-11-06@2023-11-12, 2023-11-13@2023-11-19, 2023-11-20@2023-11-26, 2023-11-27@2023-12-03, 2023-12-04@2023-12-10, 2023-12-11@2023-12-17, 2023-12-18@2023-12-24, 2023-12-25@2023-12-31] ==
日期格式可随意改动