[英]How to count working days in Android Studio?
我想要做的是從兩個定義的日期(月初和月底)計算工作日。
我正在使用我發現的一個函數,它接收三個參數, start date
、 end date
和a list of dates of non-working days
(假期和其他a 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 中選擇並存儲在變量dateIni
和dateFin
)
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;
}
}
這不是初始化Date
對象的方式:
new Date(2020-3-24)
2020-3-24
是減法,因此您將其初始化為 2020-3-24=1993 毫秒自 GMT 1970 年 1 月 1 日開始。
new Date(2020, 3, 24)
我已經解決了。 我修改了函數,現在接收到的參數是Calendar類型的三個。 前面的代碼計算工作日,但比較日期部分與數組列表(包含假期)不起作用。 我分享解決方案,以防有人使用它。
公共類 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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.