DatePicker.setMinDate(long minDate)抛出IllegalArgumentException:时间不介于

zbr*_*zbr 17 android datepicker datepickerdialog

我有一个由开始和结束日期组成的时间间隔.我有办法让用户通过DatePickerDialogs设置这些日期.以下是创建和显示对话框的方法的代码:

private void editInterval(boolean beginning) {
    DatePickerDialog dpd;
    Calendar cal = Calendar.getInstance();
    if (beginning) {
        dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {             
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                someTimeDuringYear1 = year;
                someTimeDuringMonth1 = monthOfYear + 1;
                someTimeDuringDay1 = dayOfMonth;
                Calendar cal1 = Calendar.getInstance();
                cal1.set(Calendar.YEAR, year);
                cal1.set(Calendar.MONTH, monthOfYear);
                cal1.set(Calendar.DAY_OF_MONTH, dayOfMonth);
                Calendar cal2 = Calendar.getInstance();
                cal2.set(Calendar.YEAR, someTimeDuringYear2);
                cal2.set(Calendar.MONTH, someTimeDuringMonth2);
                cal2.set(Calendar.DAY_OF_MONTH, someTimeDuringDay2);
                if (cal1.getTimeInMillis() > cal2.getTimeInMillis()) {
                    someTimeDuringYear2 = someTimeDuringYear1;
                    someTimeDuringMonth2 = someTimeDuringMonth1;
                    someTimeDuringDay2 = someTimeDuringDay1;
                }
                updateSomeTimeDuring();
                editDepartureInterval();
            }
        }, someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1);
        dpd.setTitle(getString(R.string.beginning_of_interval));
        cal.add(Calendar.MONTH, 6);
        dpd.getDatePicker().setMaxDate(cal.getTimeInMillis());
        cal.add(Calendar.MONTH, -6);
        cal.add(Calendar.DATE, 2);
        dpd.getDatePicker().setMinDate(cal.getTimeInMillis());
    } else {
        dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {             
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                someTimeDuringYear2 = year;
                someTimeDuringMonth2 = monthOfYear + 1;
                someTimeDuringDay2 = dayOfMonth;
                updateSomeTimeDuring();
                editDepartureInterval();
            }
        }, someTimeDuringYear2, someTimeDuringMonth2 - 1, someTimeDuringDay2);
        dpd.setTitle(getString(R.string.end_of_interval));
        cal.add(Calendar.MONTH, 6);
        dpd.getDatePicker().setMaxDate(cal.getTimeInMillis());
        cal.set(someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1);
        dpd.getDatePicker().setMinDate(cal.getTimeInMillis());
    }
    dpd.show();
    dpd.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
}
Run Code Online (Sandbox Code Playgroud)

beginning变量的值确定用户是否已选择编辑间隔的开始日期或结束日期.那些someTimeDuringYear1和类似的是与开始日期相关的成员变量,someTimeDuringYear2类似的与间隔的结束日期有关.在创建和显示此对话框之前,所有这些都已预先设置.

编辑开始和结束间隔时抛出异常.假设我选择编辑间隔的结束日期.一切都运作正常,直到我将日期设置为允许的最后日期.如果我这样做并确认,一切似乎都很好,但是当我再次尝试编辑间隔的结束日期时,应用程序崩溃并抛出异常.(如果我将间隔的开始日期设置为最后允许的日期然后再次尝试编辑,则会发生同样的情况.)

这是来自LogCat的日志:

03-28 17:18:16.901: E/AndroidRuntime(6112): FATAL EXCEPTION: main
03-28 17:18:16.901: E/AndroidRuntime(6112): java.lang.IllegalArgumentException: Time not between Sat Mar 30 17:18:16 CET 2013 and Sat Sep 28 17:18:16 CEST 2013
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.CalendarView.goTo(CalendarView.java:805)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.CalendarView.setMinDate(CalendarView.java:487)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.DatePicker.setMinDate(DatePicker.java:315)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at com.skypicker.android.MainActivity.editInterval(MainActivity.java:344)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at com.skypicker.android.MainActivity.access$10(MainActivity.java:296)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at com.skypicker.android.MainActivity$5.onClick(MainActivity.java:261)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:924)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.AbsListView.performItemClick(AbsListView.java:1063)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2519)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.widget.AbsListView$1.run(AbsListView.java:3173)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.os.Handler.handleCallback(Handler.java:605)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.os.Looper.loop(Looper.java:137)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at android.app.ActivityThread.main(ActivityThread.java:4424)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at java.lang.reflect.Method.invoke(Method.java:511)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
03-28 17:18:16.901: E/AndroidRuntime(6112):     at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我一直在寻找答案,并试图在整个下午提出解决方案.任何帮助表示赞赏.

谢谢.

PS:这是我在这里提出的第一个问题,所以如果有什么问题我会道歉.我很乐意提供有关正在发生的事情的任何缺失信息.

编辑:奇怪的是,即使问题在我试图设置时出现在线上minDate,实际上似乎是日期比"更大" maxDate.我相信这一点的原因是,如果我通过someTimeDuringDay2 - 1而不是someTimeDuringDay2DatePickerDialog构造函数,问题就消失了.但那时的"天"字段DatePicker实际上比我希望的要小一些.我需要它被设置为someTimeDuringDay2在当DatePickerDialog所示,不是someTimeDuringDay2 - 1.但是当日期与它相同时似乎有问题maxDate.

zbr*_*zbr 28

问题是我用来设置DatePicker's 的日历的小时,分​​钟,秒和毫秒,minDatemaxDate设置为与Calendar.getInstance()调用时的时间相对应的值.当我将日期,月份和年份传递给构造函数时DatePickerDialog,日期是相同的,但毫秒不同.因此,可能会发生在maxDate中设置的毫秒数小于DatePicker当前时间中设置的毫秒数,因此DatePicker应该显示的日期被评估为大于maxDate(尽管它仍然是同一天,只是还有更多毫秒)......同样如此minDate.

我希望这是可以理解的.

因此,将日历设置为使用它们进行设置的当天的最后一毫秒以及使用它们进行设置maxDate的当天的第一毫秒是有帮助的minDate.像这样:

(只是else条款中的一段代码.)

        dpd.setTitle(getString(R.string.end_of_interval));
        cal.add(Calendar.MONTH, 6);
        cal.set(Calendar.HOUR_OF_DAY, cal.getMaximum(Calendar.HOUR_OF_DAY));
        cal.set(Calendar.MINUTE, cal.getMaximum(Calendar.MINUTE));
        cal.set(Calendar.SECOND, cal.getMaximum(Calendar.SECOND));
        cal.set(Calendar.MILLISECOND, cal.getMaximum(Calendar.MILLISECOND));
        dpd.getDatePicker().setMaxDate(cal.getTimeInMillis());
        cal.set(someTimeDuringYear1, someTimeDuringMonth1 - 1, someTimeDuringDay1);
        cal.set(Calendar.HOUR_OF_DAY, cal.getMinimum(Calendar.HOUR_OF_DAY));
        cal.set(Calendar.MINUTE, cal.getMinimum(Calendar.MINUTE));
        cal.set(Calendar.SECOND, cal.getMinimum(Calendar.SECOND));
        cal.set(Calendar.MILLISECOND, cal.getMinimum(Calendar.MILLISECOND));
        dpd.getDatePicker().setMinDate(cal.getTimeInMillis());
Run Code Online (Sandbox Code Playgroud)

希望它对某人有所帮助.

如果有人提出更优雅的解决方案,请告诉我.


Wei*_*Liu 8

当今天不在[minDate,maxDate]时,我得到了同样的例外.但是,如果我改变了我的代码来调用setMinDate()之前setMaxDate(),它的工作.

  • 我不知道背后的逻辑是什么.这完全适合我!问题是:这个问题仅限于果冻豆设备Lollipop设备正在处理这个问题.不知道其他Android版本! (2认同)