【问题标题】:How to count working days in Android Studio?如何在 Android Studio 中计算工作日?
【发布时间】:2020-06-23 16:33:14
【问题描述】:

我想做的是从两个定义的日期(月初和月底)计算工作日。

我正在使用我发现的一个函数,它接收三个参数,start dateend datea list of dates of non-working days(假期和其他)。

下面的代码给了我 23 个工作日,但实际结果必须是 22 working days

例如

Start date is - 2020-03-01 and
End Date is - 2020-03-31 
With 7 non-working days

(日期从 DatePickerDialog 中选择并存储在变量 dateInidateFin 中)

public class FragmentConsultas extends Fragment 
{
    EditText fechaIni, fechaFin;
    Button btAsistencia;
    private int anioIni, mesIni, diaIni, anioFin, mesFin, diaFin;
    private String  sDiaI, sMesI, sDiaF, sMesF;
    List<Date> dates = new ArrayList<Date>();
    private Calendar mcurrentDateFin, mcurrentDateIni;
    private Calendar dateIni, dateFin;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View v = inflater.inflate(R.layout.fragment_consultas, container, false);

        fechaIni = v.findViewById(R.id.fechaIni);
        fechaFin = v.findViewById(R.id.fechaFin);
        btAsistencia = v.findViewById(R.id.btAsistencia);

        dates.add(new Date(2020-1-1));
        dates.add(new Date(2020-2-24));
        dates.add(new Date(2020-2-25));
        dates.add(new Date(2020-3-23));
        dates.add(new Date(2020-3-24));
        dates.add(new Date(2020-4-2));
        dates.add(new Date(2020-4-9));

        fechaIni.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mcurrentDateIni = Calendar.getInstance();
                anioIni = mcurrentDateIni.get(Calendar.YEAR);
                mesIni = mcurrentDateIni.get(Calendar.MONTH);
                diaIni = mcurrentDateIni.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog mDatePicker;
                mDatePicker = new DatePickerDialog(getContext(), R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
                    public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {

                        if (selectedday < 9){
                            sDiaI = "0" + String.valueOf(selectedday);
                        }else{
                            sDiaI =  String.valueOf(selectedday);
                        }

                        if (selectedmonth < 9){
                            sMesI = "0" + String.valueOf(selectedmonth+1);
                        }else if (selectedmonth == 9) {
                            sMesI = String.valueOf(selectedmonth+1);
                        }else{
                            sMesI = String.valueOf(selectedmonth+1);
                        }

                        fechaIni.setText(selectedyear + "-" + sMesI + "-" + sDiaI);
                        dateIni = new GregorianCalendar(selectedyear, selectedmonth, selectedday);

                        Toast.makeText(getActivity(), "Fecha de inicio: " + dateIni, Toast.LENGTH_LONG).show();

                    }
                }, anioIni, mesIni, diaIni);
                mDatePicker.show();
            }
        });

        fechaFin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mcurrentDateFin = Calendar.getInstance();
                anioFin = mcurrentDateFin.get(Calendar.YEAR);
                mesFin = mcurrentDateFin.get(Calendar.MONTH);
                diaFin = mcurrentDateFin.get(Calendar.DAY_OF_MONTH);

                DatePickerDialog mDatePicker;
                mDatePicker = new DatePickerDialog(getContext(), R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
                    public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {

                        if (selectedday < 9){
                            sDiaF = "0" + String.valueOf(selectedday);
                        }else{
                            sDiaF =  String.valueOf(selectedday);
                        }

                        if (selectedmonth < 9){
                            sMesF = "0" + String.valueOf(selectedmonth+1);
                        }else if (selectedmonth == 9) {
                            sMesF = String.valueOf(selectedmonth+1);
                        }else{
                            sMesF = String.valueOf(selectedmonth+1);
                        }

                        fechaFin.setText(selectedyear + "-" + sMesF + "-" + sDiaF);
                        dateFin = new GregorianCalendar(selectedyear, selectedmonth, selectedyear);

                        Toast.makeText(getActivity(), "Fecha fin: " + dateFin, Toast.LENGTH_LONG).show();
                    }
                }, anioFin, mesFin, diaFin);
                mDatePicker.show();
            }
        });


        btAsistencia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int diasLab = diasHabiles(dateIni, dateFin, dates);

                Toast.makeText(getActivity(), "Días Laborables: " + diasLab, Toast.LENGTH_LONG).show();
            }
        });

        return v;

    }

    public int diasHabiles(Calendar fechaInicial, Calendar fechaFinal, List<Date> listaFechasNoLaborables) {
        int diffDays = 0;
        boolean diaHabil = false;
        //mientras la fecha inicial sea menor o igual que la fecha final se cuentan los dias
        while (fechaInicial.before(fechaFinal) || fechaInicial.equals(fechaFinal)) {

            if (!listaFechasNoLaborables.isEmpty()) {
                for (Date date : listaFechasNoLaborables) {
                    Date fechaNoLaborablecalendar = fechaInicial.getTime();
                    //si el dia de la semana de la fecha minima es diferente de sabado o domingo
                    if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && !fechaNoLaborablecalendar.equals(date)) {
                        //se aumentan los dias de diferencia entre min y max
                        diaHabil = true;
                    } else {
                        diaHabil = false;
                        break;
                    }
                }
            } else {
                if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                    //se aumentan los dias de diferencia entre min y max
                    diffDays++;
                }
            }
            if (diaHabil == true) {
                diffDays++;
            }
            //se suma 1 dia para hacer la validacion del siguiente dia.
            fechaInicial.add(Calendar.DATE, 1);
        }
        return diffDays;
    }
}

【问题讨论】:

  • 嘿,欢迎来到 StackOverflow!请用英文写,以便我们了解您遇到的问题。谢谢!
  • 你需要用英文写你的问题或使用es.stackoverflow.com
  • 我想要做的是从两个日期(月初和月底)计算工作日数,我正在使用我在那里发现的接收三个参数的函数,开始日期、结束日期和一个非工作日日期列表(节假日和其他)。使用代码原样,它给了我 23 个工作日,事实是 3 月有 22 个工作日,不计算列表中的那些(假期和那个)例如:2020-03-01 和 2020-03-31(你可以在代码中看到这些日期是从 DatePickerDialog 中选择并存储在变量 dateIni 和 dateFin)
  • 运行这段代码会发生什么?你有错误吗?如果是这样,它们是什么?如果不是,结果与您想要的有什么不同?

标签: java android arrays list function


【解决方案1】:

这不是您初始化Date 对象的方式:

new Date(2020-3-24)

2020-3-24 是减法,因此您将其初始化为 2020-3-24=1993 milliseconds since the start of January 1 1970 in GMT

您可能打算使用constructor that takes a year, month, and day

new Date(2020, 3, 24)

【讨论】:

    【解决方案2】:

    我已经解决了。我修改了函数,现在它接收的参数是日历类型的三个。前面的代码计算了工作日,但与数组列表(包含假期)的比较日期部分不起作用。 我分享解决方案以防有人使用它。

    公共类 FragmentConsultas 扩展 Fragment {

    EditText fechaIni, fechaFin;
    Button btAsistencia;
    private int anioIni, mesIni, diaIni, anioFin, mesFin, diaFin;
    private String  sDiaI, sMesI, sDiaF, sMesF;
    List<Calendar> dates = new ArrayList<Calendar>();
    private Calendar mcurrentDateFin, mcurrentDateIni;
    private Calendar dateIni, dateFin, cal, cal1, cal2, cal3;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
    
        View v = inflater.inflate(R.layout.fragment_consultas, container, false);
    
        fechaIni = v.findViewById(R.id.fechaIni);
        fechaFin = v.findViewById(R.id.fechaFin);
        btAsistencia = v.findViewById(R.id.btAsistencia);
    
        cal = new GregorianCalendar(2020, Calendar.MARCH, 23);
        cal1 = new GregorianCalendar(2020,Calendar.MARCH,24);
        cal2 = new GregorianCalendar(2020, Calendar.MARCH,3);
        cal3 = new GregorianCalendar(2020,Calendar.MARCH,9);
    
        dates.add(cal);
        dates.add(cal1);
        dates.add(cal2);
        dates.add(cal3);
    
    
        fechaIni.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mcurrentDateIni = Calendar.getInstance();
                anioIni = mcurrentDateIni.get(Calendar.YEAR);
                mesIni = mcurrentDateIni.get(Calendar.MONTH);
                diaIni = mcurrentDateIni.get(Calendar.DAY_OF_MONTH);
    
                DatePickerDialog mDatePicker;
                mDatePicker = new DatePickerDialog(getContext(), R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
                    public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
    
                        if (selectedday < 9){
                            sDiaI = "0" + String.valueOf(selectedday);
                        }else{
                            sDiaI =  String.valueOf(selectedday);
                        }
    
                        if (selectedmonth < 9){
                            sMesI = "0" + String.valueOf(selectedmonth+1);
                        }else if (selectedmonth == 9) {
                            sMesI = String.valueOf(selectedmonth+1);
                        }else{
                            sMesI = String.valueOf(selectedmonth+1);
                        }
    
                        fechaIni.setText(selectedyear + "-" + sMesI + "-" + sDiaI);
                        dateIni = new GregorianCalendar(selectedyear, selectedmonth, selectedday);
    
                    }
                }, anioIni, mesIni, diaIni);
                mDatePicker.show();
            }
        });
    
        fechaFin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mcurrentDateFin = Calendar.getInstance();
                anioFin = mcurrentDateFin.get(Calendar.YEAR);
                mesFin = mcurrentDateFin.get(Calendar.MONTH);
                diaFin = mcurrentDateFin.get(Calendar.DAY_OF_MONTH);
    
                DatePickerDialog mDatePicker;
                mDatePicker = new DatePickerDialog(getContext(), R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
                    public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday) {
    
                        if (selectedday < 9){
                            sDiaF = "0" + String.valueOf(selectedday);
                        }else{
                            sDiaF =  String.valueOf(selectedday);
                        }
    
                        if (selectedmonth < 9){
                            sMesF = "0" + String.valueOf(selectedmonth+1);
                        }else if (selectedmonth == 9) {
                            sMesF = String.valueOf(selectedmonth+1);
                        }else{
                            sMesF = String.valueOf(selectedmonth+1);
                        }
    
                        fechaFin.setText(selectedyear + "-" + sMesF + "-" + sDiaF);
                        dateFin = new GregorianCalendar(selectedyear, selectedmonth, selectedday);
    
                    }
                }, anioFin, mesFin, diaFin);
                mDatePicker.show();
            }
        });
    
    
        btAsistencia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int diasLab = diasHabiles(dateIni, dateFin, dates);
    
                Toast.makeText(getActivity(), "Días Laborables: " + diasLab, Toast.LENGTH_LONG).show();
            }
        });
    
        return v;
    
    }
    
    public int diasHabiles(Calendar fechaInicial, Calendar fechaFinal, List<Calendar> listaFechasNoLaborables) {
        int diffDays = 0;
        boolean diaHabil = false;
        //mientras la fecha inicial sea menor o igual que la fecha final se cuentan los dias
        while (fechaInicial.before(fechaFinal) || fechaInicial.equals(fechaFinal)) {
    
            if (!listaFechasNoLaborables.isEmpty()) {
                for (Calendar date : listaFechasNoLaborables) {
                    Date fechaNoLaborablecalendar = fechaInicial.getTime();
    
                    Log.e("FECHANOLABORABLE", String.valueOf(fechaNoLaborablecalendar));
                    Log.e("FECHADATE", String.valueOf(date.getTime()));
    
                    //si el dia de la semana de la fecha minima es diferente de sabado o domingo
                    if ((fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) && (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) && (!fechaNoLaborablecalendar.equals(date.getTime()))) {
                        //se aumentan los dias de diferencia entre min y max
                        diaHabil = true;
                    } else {
                        diaHabil = false;
                        break;
                    }
                }
            } else {
                if (fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && fechaInicial.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY) {
                    //se aumentan los dias de diferencia entre min y max
                    diffDays++;
                }
            }
            if (diaHabil) {
                diffDays++;
            }
            //se suma 1 dia para hacer la validacion del siguiente dia.
            fechaInicial.add(Calendar.DATE, 1);
        }
        return diffDays;
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2010-09-25
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多