給定任意兩日期 date_start、date_end,先計算兩日期間的天數間隔,再分別求出它們下一個星期一的日期,得到能整除 7 的完整日期間隔(已剔除星期幾問題),即可得兩新日期間的周數,乘以 5 得基礎工作天數 tmpWorkingDays。但這不是最終結果,還需計算原始日期對新日期的時間偏移量:date_start 的偏移量 date_start_change 需加,date_end 的偏移量 date_end_change 需減。最終工作天數 = tmpWorkingDays + date_start_change - date_end_change。支援跨年計算。
package com.date.utlit;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateCal {
public static void main(String[] args) {
try {
String strDateStart = "2006-10-1";
String strDateEnd = "2006-10-14";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date_start = sdf.parse(strDateStart);
Date date_end = sdf.parse(strDateEnd);
DateCal app = new DateCal();
Calendar cal_start = Calendar.getInstance();
Calendar cal_end = Calendar.getInstance();
cal_start.setTime(date_start);
cal_end.setTime(date_end);
System.out.println("星期-->" + app.getChineseWeek(cal_start)
+ " 日期-->" + cal_start.get(Calendar.YEAR) + "-"
+ (cal_start.get(Calendar.MONTH) + 1) + "-"
+ cal_start.get(Calendar.DAY_OF_MONTH));
System.out.println("星期-->" + app.getChineseWeek(cal_end) + " 日期-->"
+ cal_end.get(Calendar.YEAR) + "-"
+ (cal_end.get(Calendar.MONTH) + 1) + "-"
+ cal_end.get(Calendar.DAY_OF_MONTH));
System.out.println("工作日為-->" + app.getWorkingDay(cal_start, cal_end));
System.out.println("休息日-->" + app.getHolidays(cal_start, cal_end));
} catch (Exception e) { e.printStackTrace(); }
}
public int getDaysBetween(Calendar d1, Calendar d2) {
if (d1.after(d2)) { Calendar swap = d1; d1 = d2; d2 = swap; }
int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
int y2 = d2.get(Calendar.YEAR);
if (d1.get(Calendar.YEAR) != y2) {
d1 = (Calendar) d1.clone();
do {
days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
d1.add(Calendar.YEAR, 1);
} while (d1.get(Calendar.YEAR) != y2);
}
return days;
}
public int getWorkingDay(Calendar d1, Calendar d2) {
int result = -1;
if (d1.after(d2)) { Calendar swap = d1; d1 = d2; d2 = swap; }
int betweendays = getDaysBetween(d1, d2);
int charge_start_date = 0, charge_end_date = 0;
int stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
int etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
if (stmp != 0 && stmp != 6) charge_start_date = stmp - 1;
if (etmp != 0 && etmp != 6) charge_end_date = etmp - 1;
result = (getDaysBetween(getNextMonday(d1), getNextMonday(d2)) / 7) * 5
+ charge_start_date - charge_end_date;
return result;
}
public String getChineseWeek(Calendar date) {
final String[] dayNames = {"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return dayNames[date.get(Calendar.DAY_OF_WEEK) - 1];
}
public Calendar getNextMonday(Calendar date) {
Calendar result = date;
do {
result = (Calendar) result.clone();
result.add(Calendar.DATE, 1);
} while (result.get(Calendar.DAY_OF_WEEK) != 2);
return result;
}
public int getHolidays(Calendar d1, Calendar d2) {
return getDaysBetween(d1, d2) - getWorkingDay(d1, d2);
}
}
此實現未考慮法定假日,僅按週末(週六、週日)計算休息日。