首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 計算任意兩日期間的工作天數

     編輯:Java 相關知識

核心思路

給定任意兩日期 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);
    }
}

此實現未考慮法定假日,僅按週末(週六、週日)計算休息日。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved