20

I know there are quite a lot of question for this but none of the solutions are working for me, so this question. I want to restrict user to select date before today, but am not able to do so.

public class DatePickerDialogFragment extends DialogFragment {

    private OnDateSetListener listener;

    public void setListener(OnDateSetListener listener) {
        this.listener = listener;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Calendar calendar = Calendar.getInstance();
        int year    = calendar.get(Calendar.YEAR);
        int month   = calendar.get(Calendar.MONTH);
        int day     = calendar.get(Calendar.DAY_OF_MONTH);

        DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
        dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
        return dialog;
    }
}

I am showing it as:

DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");

I want the user should not be able to select date before today. As you can see I called setMinDate() method with today's time but it as no effect. The dialog shows dates before today as grayed but selectable.

I also tried to sub-class DatePickerDialog and override onDateChanged as suggested in some stackoverflow answers but without any success.

Abdullah
  • 7,143
  • 6
  • 25
  • 41

8 Answers8

31

Try this method

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar calendar = Calendar.getInstance();
    int year    = calendar.get(Calendar.YEAR);
    int month   = calendar.get(Calendar.MONTH);
    int day     = calendar.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
    Field mDatePickerField;
    try {
            mDatePickerField = dialog.getClass().getDeclaredField("mDatePicker");
            mDatePickerField.setAccessible(true);
    } catch (Exception e) {
            e.printStackTrace();
    }
    dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
    return dialog;
}

instead of your

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar calendar = Calendar.getInstance();
    int year    = calendar.get(Calendar.YEAR);
    int month   = calendar.get(Calendar.MONTH);
    int day     = calendar.get(Calendar.DAY_OF_MONTH);

    DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
    dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
    return dialog;
}

EDIT1:

I have also faced this issue that user can select not-selectable dates in Android L 5.0.2. Currently there is bug reported here. It is solved in Android L 5.1.0.

For temporary solution of this issue you can compare selected date with current system date and put some condition based on that. I used this as my workaround

EDIT2:

add onDateSent() method in DatePickerDialogFragment and just check if it's earlier than the date you set in setMinDate(). If so, then just show the DatePickerDialog again.

final long today = System.currentTimeMillis() - 1000;

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
            Calendar calendar = Calendar.getInstance();
            calendar.set(year, monthOfYear, dayOfMonth);
            //If user tries to select date in past (or today)
            if (calendar.getTimeInMillis() < today)
            {
                //Make them try again
               DatePickerDialogFragment fragment = new DatePickerDialogFragment();
               fragment.setListener(dateSetListener);
               fragment.show(getSupportFragmentManager(), "Choose booking date");
               Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show();
            }
            else
            {
                //success
            }
}
Rajesh Jadav
  • 12,801
  • 5
  • 53
  • 78
8

Get System Time and subtract 1 second from It

 @Override
 public Dialog onCreateDialog(Bundle savedInstanceState) {
    Calendar calendar = Calendar.getInstance();
    int year    = calendar.get(Calendar.YEAR);
    int month   = calendar.get(Calendar.MONTH);
    int day     = calendar.get(Calendar.DAY_OF_MONTH);

     dialog = new DatePickerDialog(act, listener, year, month, day);
     dialog.getDatePicker().setMinDate(System.currentTimeMillis() -1000);
     return dialog;
 }
Kishore Jethava
  • 6,666
  • 5
  • 35
  • 51
7
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
K.Dᴀᴠɪs
  • 9,945
  • 11
  • 33
  • 43
Arpit
  • 297
  • 1
  • 5
  • 13
  • 2
    Although your code snippet might solve the issue, you should describe what’s the purpose of your code (how it solves the problem). Furthermore, you might want to check https://stackoverflow.com/help/how-to-answer – Ahmad F Mar 26 '18 at 09:46
3

Above API 11 For min date you can use

android:minDate="mm/dd/yyyy" or setMinDate(long time) For Max date

android:maxDate="mm/dd/yyyy" // In XML

setMaxDate(new Date().getTime());// Current time

Kishore Jethava
  • 6,666
  • 5
  • 35
  • 51
Sangeeta
  • 961
  • 2
  • 13
  • 34
1

I set the minimum date using the method to the current year which is 2020-05-20 like this

datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());

The moment you click the date picker it displays 2020 as the minimum year

I hope the answer helps.

Nelson Katale
  • 1,309
  • 15
  • 21
1

In the XML File

<DatePicker
android:minDate="mm/dd/yyyy"
android:maxDate="mm/dd/yyyy" >

ex:

android:minDate="10/12/2000"


android:maxDate="10/12/2000"
0

Android DatePickerDialog: Set min and max date for selection to show allowed dates from 16 to 30 Aug 2022.

// Month is 0 based for Calendar.
final Calendar cMax = Calendar.getInstance();
// CMax.set(mYear, mMonth-1, mDay)
cMax.set(2022,7,30); // for date 30/Aug/2022
XXDatePicker.setMaxDate(cMax.getTimeInMillis());

final Calendar cMin = Calendar.getInstance();
// CMin.set(mYear, mMonth-1, mDay)
cMin.set(2022,7,16); // for date 16/Aug/2022
XXDatePicker.setMinDate(cMin.getTimeInMillis());
SHS
  • 1,414
  • 4
  • 26
  • 43
-1
  mdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final Calendar calendar = Calendar.getInstance();
            //set time zone
            calendar.setTimeZone(TimeZone.getTimeZone("UTC"));

            int selectedYear = calendar.get(Calendar.YEAR);
            int selectedMonth = calendar.get(Calendar.MONTH);
            int selectedDay = calendar.get(Calendar.DAY_OF_MONTH);
            DatePickerDialog datePickerDialog = new DatePickerDialog(BrandResturant_DetailActivity.this,
                    new DatePickerDialog.OnDateSetListener() {
                        public void onDateSet(DatePicker view, int selectedYear,
                                              int selectedMonth, int selectedDay) {
                            mDay = selectedDay;
                            mMonth = selectedMonth;
                            mYear = selectedYear;
                            StringBuilder Date = new StringBuilder("");
                            String conver = Integer.toString(selectedYear);
                            Date.append(conver);
                            Date.append("-");
                            selectedMonth++;
                            conver = Integer.toString(selectedMonth);
                            Date.append(conver);
                            Date.append("-");
                            conver = Integer.toString(selectedDay);
                            Date.append(conver);
                            isDob = true;
                        }
                    }, mDay, mMonth, mYear);

            datePickerDialog.getDatePicker().setMaxDate(calendar.getTimeInMillis());


            
            //Getting Today date to calendar2
            final Calendar calendar2 = Calendar.getInstance();
            //Set Minimum date of calendar
            calendar2.set(2021, 1, 3);
            datePickerDialog.getDatePicker().setMinDate(calendar2.getTimeInMillis());
            datePickerDialog.setTitle("Select Date");
            datePickerDialog.show();


            //Getting Today date to calendar3
            final Calendar calendar3 = Calendar.getInstance();
            //Set Maximum date of calendar - Method 1
            calendar3.set(2021, 3, 3);
            //Set Maximum One Month date from today(calendar3) date to calendar -Method 2
            //In Place of month u can also set year, day
            //calendar3.add(Calendar.MONTH, 1);
            datePickerDialog.getDatePicker().setMaxDate(calendar3.getTimeInMillis());
            datePickerDialog.setTitle("Select Date");
            datePickerDialog.show();
        }
    });
  • Please provide an explanation for your code. – Ashish Sharma Feb 04 '21 at 07:16
  • @AshishSharma you can set the minimum date for selection by getting the date from the calendar2 or to set the minimum date programatically by calendar2.set(2021, 1, 3) and set the maximum date for selection by setting the calendar3.set(2021, 3, 3) by programatically or u can also set by month,day, year by specifying month,day,year for eg. i'm adding one moth month maximum for calender3 date calendar3.add(Calendar.MONTH, 1); – Kiran Kumar S Feb 08 '21 at 12:55