使用日期参数计算工作日

时间:2014-11-24 08:37:09

标签: java date time calendar

我需要创建一个应用程序来计算它的工作日数。例如是2014年9月23日。那是本月的第17个工作日。显然它排除了周末。当月结束时,柜台将重新开始。因此,当日期是10月1日时,计数器将等于1。

我已经拥有这套代码,它适用于今天的日期,即11-24-14。输出为17是正确的。但是对于其他日期来说这是错误的。我没有进行一些验证,例如周末检查,因为我正在测试逻辑。

这是代码块:

Date dateToday = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(dateToday);
    int year = cal.get(Calendar.YEAR);
    int month = cal.get(Calendar.MONTH);
    int day = cal.get(Calendar.DAY_OF_WEEK);

    int week = cal.get(Calendar.WEEK_OF_MONTH);
    int dayNo=0;


    System.out.println("year= " + year + " month= " + month + " day= "
            + day + " week= " + week);
    if ((day == Calendar.SATURDAY) && (day == Calendar.SUNDAY)) {
        willPush = false;
    }else{
        if(week>4){
            week-=1;
        }
        if(week==1){
            dayNo+=day-1;
        }else if(week==2){
            dayNo=day+5;
        }else if(week==3){
            dayNo=day+10;
        }else if(week==4){
            dayNo=day+15;
        }else if(week==5){
            dayNo=day+20;
        }
        dayNo-=1;
    }

    System.out.println("DayNO: "+dayNo);

更新:刚才发现这个逻辑存在缺陷,存在很大缺陷。将尝试一种新方法,我正在考虑循环这个月的日子,然后检查它们是否是周末。不知道这是不是最好的主意。

2 个答案:

答案 0 :(得分:1)

以下是示例代码。使用joda库。

import org.joda.time.DateTimeConstants;
import org.joda.time.LocalDate;

public class WeekDays {
    public static void main(String[] args) {
        final LocalDate start = new LocalDate(2014, 1, 1);
        final LocalDate end = new LocalDate(2014, 1, 14);

        LocalDate weekday = start;

        if (start.getDayOfWeek() == DateTimeConstants.SATURDAY ||
                start.getDayOfWeek() == DateTimeConstants.SUNDAY) {
            weekday = weekday.plusWeeks(1).withDayOfWeek(DateTimeConstants.MONDAY);
        }

        int weekdayCount = 1;
        while (weekday.isBefore(end)) {
            weekdayCount++;
            System.out.println(weekday);

            if (weekday.getDayOfWeek() == DateTimeConstants.FRIDAY)
                weekday = weekday.plusDays(3);
            else
                weekday = weekday.plusDays(1);
        }

        System.out.println(weekdayCount);
    }
}

答案 1 :(得分:1)

这是我这样做的方式:

public class Main {

    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();
        c.set(2014, 0, 3, 0, 0);
        new Main().computeNbDays(c);
    }

    private void computeNbDays(Calendar cal) {
        int day = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println("day = " + day);

        int nbDays = 0;
        for (int i = 1; i <= day; i++) {
            cal.set(Calendar.DAY_OF_MONTH, i);
            if (workedDay(cal)) {
                nbDays++;
            }
        }

        System.out.println(nbDays);
    }

    private boolean workedDay(Calendar c) {
        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
            return false;
        }
        if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
            return false;
        }

        return !holidays.contains(c);
    }

    List<Calendar> holidays = Arrays.asList(
            newCalendar(2014, 0, 1), // NEW YEAR
            newCalendar(2014, 11, 25) // XMAS
        );

    private static final Calendar newCalendar(int year, int month, int day) {
        Calendar c = Calendar.getInstance();
        c.set(year, month, day, 0, 0);
        return c;
    }
}

目的是从第1天到第X天循环,看看它是否是工作日,而不是假日。您需要自定义假期列表。