在 DatePIcker 中设置 MinDate 和 MaxDate

Posted

技术标签:

【中文标题】在 DatePIcker 中设置 MinDate 和 MaxDate【英文标题】:Set MinDate and MaxDate in DatePIcker 【发布时间】:2017-04-07 04:18:14 【问题描述】:

创建我正在显示 DatePicker 的应用程序。现在我想设置 DatePicker 的 MinDate 是前两年,最大日期是未来两年。选择应该基于当前日期。假设当前日期是 23/11/2016 所以datepicker 应在 DatePicker 中显示截至 23/11/2014 的日期,所有日期应在 23/11/2014 之前禁用。当我们单击 Datepicker 时,光标应位于当前日期。创建 DtaePicker

private void showDateDailog() 

    final DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() 

        @Override
        public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDate) 

            year = selectedYear;
            month = selectedMonth;
            day = selectedDate;

          ((TextView) findViewById(R.id.textViewTORStartDate)).setText(new StringBuilder().append(day).append("/")
                        .append(month + 1).append("/").append(year));

        
    , year, month, day);
    datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
    datePickerDialog.show();

【问题讨论】:

【参考方案1】:

使用以下代码设置最少两年前和最多两年后的日期:

Calendar c = Calendar.getInstance();
c.add(Calendar.YEAR, -2); // subtract 2 years from now
datePickerDialog.getDatePicker().setMinDate(c.getTimeInMillis());
c.add(Calendar.YEAR, 4); // add 4 years to min date to have 2 years after now
datePickerDialog.getDatePicker().setMaxDate(c.getTimeInMillis());

【讨论】:

【参考方案2】:

我相信这段代码确实可以帮助您解决问题。

这是您的修复代码 -

private void showDateDailog() 

final DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() 

    @Override
    public void onDateSet(DatePicker datePicker, int selectedYear, int selectedMonth, int selectedDate) 

        year = selectedYear;
        month = selectedMonth;
        day = selectedDate;

      ((TextView) findViewById(R.id.textViewTORStartDate)).setText(new StringBuilder().append(day).append("/")
                    .append(month + 1).append("/").append(year));

    
, year, month, day);

final Calendar calendar = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
int yy = calendar.get(Calendar.YEAR);
int mm = calendar.get(Calendar.MONTH);
int dd = calendar.get(Calendar.DAY_OF_MONTH);
//Min date setting part
cal.set(Calendar.MONTH, mm);
cal.set(Calendar.DAY_OF_MONTH, dd);
cal.set(Calendar.YEAR, yy - 2);
datePickerDialog.setMinDate(cal.getTimeInMillis());
//Maximum date setting part
Calendar calen = Calendar.getInstance();
calen.set(Calendar.MONTH, mm);
calen.set(Calendar.DAY_OF_MONTH, dd);
calen.set(Calendar.YEAR, yy + 2);
datePickerDialog.setMaxDate(calen.getTimeInMillis());
datePickerDialog.show();

【讨论】:

【参考方案3】:

您可以设置 MinDate 和 MaxDate,您需要使用 DatePicker 类。

class MDatePickerDialog extends DatePickerDialog 
    MDatePickerDialog(Context c) 
        super(c, null, 2016, 11, 23);
        Date min = new Date(2018-1900, 4, 21);
        DatePicker p = getDatePicker();
        CalendarView cv = p.getCalendarView();
        long cur = cv.getDate();
        int d = cv.getFirstDayOfWeek();
        p.setMinDate(min.getTime());
        cv.setDate(cur + 1000L*60*60*24*40);
        cv.setFirstDayOfWeek((d + 1) % 7);
        cv.setDate(cur);
        cv.setFirstDayOfWeek(d);
    

希望这会对你有所帮助。

【讨论】:

【参考方案4】:

您可以从 DatePickerDialog 获取底层 DatePicker(只需调用 getDatePicker())并使用以下方法设置其边界:

setMinDate(long minDate)
setMaxDate(long maxDate)

其中参数是自默认时区 1970 年 1 月 1 日 00:00:00 以来的通常毫秒数。当然,您仍然需要计算这些值,但这对于 Calendar 类应该是微不足道的:只需传递当前日期并从中添加或减去 x 年..

【讨论】:

1970 年 1 月 1 日 00:00:00 之前的日期呢?

以上是关于在 DatePIcker 中设置 MinDate 和 MaxDate的主要内容,如果未能解决你的问题,请参考以下文章

如何在日期选择器中设置 3 个月的日期范围?

AngularJS:Datepicker 指令如何在占位符中有今天的日期

在 jQuery datepicker 中设置最小日期

如何在 DatePicker 中设置当前日期?

minDate:0,不在datepicker中工作

在IOS中设置Datepicker只选择月份和年份