日期选择器对话框日期验证

Date picker dialog date validation

我想实现以下行为:

我的代码是:

private void DateDialog() {
    final DatePickerDialog dpDialog = new DatePickerDialog(this,android.app.AlertDialog.THEME_DEVICE_DEFAULT_DARK,new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker datePicker, int i, int i1, int i2) {
            cal = Calendar.getInstance();
            cal.setTimeInMillis(System.currentTimeMillis());
            //int curyear = cal.get(Calendar.YEAR);
            cal.set(i, i1, i2);
            etsubmstartdate.setText(dateformatter.format(cal.getTime()));
            selecteddate = dateformatter.format(cal.getTime());
            Log.e("Date of first edit text",selecteddate);
            etsubmstartdate.setText(selecteddate);
        }
    }, year, month, day);
    if (System.currentTimeMillis()<=15)
    {
        dpDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
        long now = System.currentTimeMillis() - 1000;
        dpDialog.getDatePicker().setMaxDate(now+(1000*60*60*24*15));
        dpDialog.show();
    }
    else if(System.currentTimeMillis()>=15)
    {
        dpDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000*60*60*24*2);
        long now = System.currentTimeMillis() - 1000*60*60*24*2;
        dpDialog.getDatePicker().setMaxDate(now+(1000*60*60*24*14));
        dpDialog.show();
    }
}

您可以使用 .before.after 方法 Date class.

例如,

if (currentDate.before(yourdate)) {

//write your code require to before current date
}

if (currentDate.after(yourdate)) {

//write your code require to after current date
}

根据您的代码,请替换 DateDialog() 方法中的以下代码

private void DateDialog() {

 final DatePickerDialog.OnDateSetListener date = new DatePickerDialog.OnDateSetListener() {

                    @Override
                    public void onDateSet(DatePicker view, int year, int monthOfYear,
                                          int dayOfMonth) {
                        // TODO Auto-generated method stub
                        myCalendar.set(Calendar.YEAR, year);
                        myCalendar.set(Calendar.MONTH, monthOfYear);
                        myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                        updateLabel();
                    }

                };

                DatePickerDialog dpDialog = new DatePickerDialog(MainActivity.this, date, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH));

                Toast.makeText(MainActivity.this, "date::"+myCalendar.getTimeInMillis(), Toast.LENGTH_SHORT).show();

                String dt = "2018-04-15";
                String dtSixteen = "2018-04-16";

                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
                try {
                    Date dateFifteen = format.parse(dt);
                    Calendar calFifteen = Calendar.getInstance();
                    calFifteen.setTime(dateFifteen);

                    Date dateSixteen = format.parse(dtSixteen);
                    Calendar calSixteen = Calendar.getInstance();
                    calSixteen.setTime(dateSixteen);


                    Date currentDate = myCalendar.getTime();
                    Calendar calendar = Calendar.getInstance();

                    calendar.setTime( myCalendar.getTime() );
                    calendar.set(Calendar.HOUR_OF_DAY, 0);
                    calendar.set(Calendar.MINUTE, 0);
                    calendar.set(Calendar.SECOND, 0);
                    calendar.set(Calendar.MILLISECOND, 0);

                    currentDate = calendar.getTime();


                    if(currentDate.before(dateFifteen) || currentDate.equals(dateFifteen)){
                        dpDialog.getDatePicker().setMaxDate(calFifteen.getTimeInMillis());
                    }else {
                         dpDialog.getDatePicker().setMinDate(calSixteen.getTimeInMillis());
                    }

                } catch (ParseException e) {
                    e.printStackTrace();
                }

                dpDialog.show();

}

我没有测试过,但是类似下面的东西。

    ZoneId zone = ZoneId.systemDefault();
    LocalDate today = LocalDate.now(zone);
    LocalDate min;
    LocalDate max;
    if (today.getDayOfMonth() < 16) {
        min = today.withDayOfMonth(1);
        max = today.withDayOfMonth(15);
    } else {
        min = today.withDayOfMonth(16);
        max = today.with(TemporalAdjusters.lastDayOfMonth());
    }

    DatePicker picker = dpDialog.getDatePicker();
    picker.setMinDate(min.atStartOfDay(zone).toInstant().toEpochMilli());
    picker.setMaxDate(max.atStartOfDay(zone).toInstant().toEpochMilli());

    dpDialog.show();

我正在使用 java.time,现代 Java 日期和时间 API。当你这样做的时候,你也可以用现代的 classes 代替你对古老的 Calendar class 和朋友的使用。现代 API 更好用。

我在犹豫是否要通过 ZoneId.systemDefault() 使用设备时区设置,但由于日期选择器依赖于它,我找不到解决办法。该设置可能随时被程序的另一部分更改,从而导致不可预知的结果。

你的代码出了什么问题?

System.currentTimeMillis() 与值 15 进行比较将不起作用。该方法为您提供自 1970 年 1 月 15 日 00:00 UTC 纪元以来的毫秒数。当前值大约为 1 524 000 000 000。所以总是比 15 大得多。

你的时间计算是否正确我还没有检查过。我发现自己在代码中进行此类数学运算非常麻烦。我更愿意将它留给经过良好测试的库方法。它更不容易出错,它允许更清晰的代码。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更高版本以及较新的 Android 设备上(据我所知,来自 API 级别 26)现代 API 是内置的。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,新 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接