如何计算JAVA中两个不同日期之间的工作天数(不包括周末)?

问题描述 投票:0回答:3

我的要求是计算给定的两个日期之间的Days数,不包括SaturdaySunday

例子:

Start date - 10/09/15 and End date 18/09/15

Result: 7

日期为

DD/MM/YY
格式。

代码:

import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;


public class DaysCounter {
    private String startDate;
    private String endDate;

    public void calculateDate(){
        @SuppressWarnings("resource")
        Scanner in=new Scanner(new InputStreamReader(System.in));

        System.out.println("Enter the starting date (DD/MM/YY) :");
        startDate=in.next();

        System.out.println("Enter the End date (DD/MM/YY) :");
        endDate=in.next();

        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        try
        {
            Calendar start = Calendar.getInstance();
            start.setTime(sdf.parse(startDate));
            Calendar end = Calendar.getInstance();
            end.setTime(sdf.parse(endDate));
            int workingDays = 0;
            while(!start.after(end))
            {
                int day = start.get(Calendar.DAY_OF_WEEK);
                if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY))
                    workingDays++;
                start.add(Calendar.DATE, 1);
            }
            System.out.println(workingDays);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    public static void main(String[] args)
    {
        DaysCounter daysCounter=new DaysCounter();
        daysCounter.calculateDate();
    }
}

这里是上面代码的结果。

1 -

Enter the starting date (DD/MM/YY) :
14/09/15
Enter the End date (DD/MM/YY) :
20/09/15

5

2 -

Enter the starting date (DD/MM/YY) :
14/09/15
Enter the End date (DD/MM/YY) :
17/09/15

2

3 -

Enter the starting date (DD/MM/YY) :
31/08/15
Enter the End date (DD/MM/YY) :
30/09/15

21

如上面第一个示例所示,结果是正确的。

但是对于第二个例子结果不正确,预期结果是4.

即使是第三个例子,结果也不正确。

即使我输入任何工作日和星期六之间的日期也会得到不正确的结果。

请建议,应该对代码进行哪些更改。

谢谢。

java
3个回答
5
投票

你创建

SimpleDateFormat
有误,改成
yy
而不是
yyyy

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy");

这应该可以解决您的问题。我看不出你的逻辑有任何问题。

编辑

根据您的评论,如果您的开始日期大于结束日期,那么您必须在

while
循环之前交换它

   if(start.after(end)) {
       Calendar tempCal;
       tempCal = start;
       start = end;
       end = tempCal;
    }

4
投票

检查以下代码:

import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;


public class DaysCounter {
private String startDate;
private String endDate;

public void calculateDate(){
    @SuppressWarnings("resource")
    Scanner in=new Scanner(new InputStreamReader(System.in));

    System.out.println("Enter the starting date (DD/MM/YY) :");
    startDate=in.next();

    System.out.println("Enter the End date (DD/MM/YY) :");
    endDate=in.next();

    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    try
    {
        Calendar start = Calendar.getInstance();
        start.setTime(sdf.parse(startDate));
        Calendar end = Calendar.getInstance();
        end.setTime(sdf.parse(endDate));
        int workingDays = 0;
        while(!start.after(end))
        {
            int day = start.get(Calendar.DAY_OF_WEEK);

            day = day + 2;
            if (day > 7){
                day = day -7;
            }

            if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY))
                workingDays++;
            start.add(Calendar.DATE, 1);
        }
        System.out.println(workingDays);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

public static void main(String[] args)
{
    DaysCounter daysCounter=new DaysCounter();
    daysCounter.calculateDate();
}
}

0
投票
/*this program is for count the days between two days with excluding SATURDAY and SUNDAY*/

package example;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;

public class ValidDate {

    private static Pattern datePattern = Pattern.compile("^\\d{1,2}/\\d{1,2}/\\d{4}$");

    public static boolean isValidFormat(String src, String src1) {
        if (datePattern.matcher(src).matches() && datePattern.matcher(src1).matches()) {
            return true;
        }
        return false;
    }

    public static boolean isValidDate(String str, String str1) {
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        sdf.setLenient(false);

        try {
            sdf.parse(str);
            sdf.parse(str1);
            return true;
        } catch (ParseException e) {
            return false;
        }

    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter start Date");
        String startDate = sc.next();

        System.out.println("Enter end date");
        String endDate = sc.next();

        int workingDays = 0;
        boolean isValidPattern = isValidFormat(startDate, endDate);
        if (isValidPattern) {
            SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
            sdf.setLenient(false);
            if (isValidDate(startDate, endDate)) {
//System.out.println("This is valid dates");
                try {
                    Calendar start = Calendar.getInstance();
                    start.setTime(sdf.parse(startDate));
                    Calendar end = Calendar.getInstance();
                    end.setTime(sdf.parse(endDate));

                    while (!start.after(end)) {
                        int day = start.get(Calendar.DAY_OF_WEEK);
                        if ((day != Calendar.SATURDAY) && (day != Calendar.SUNDAY)) {
                            workingDays++;
                        }
                        start.add(Calendar.DATE, 1);
                    }
                    System.out.println("Working Days=" + workingDays);
            
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } else {
                System.out.println("Given date is invalid");
            }
        } else {
            System.out.println("Please enter date in [DD/MM/YYYY] format");
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.