{"record":{"id":"943595bb001c2a1f","repo":"Bigkoo/Android-PickerView","slug":"startdate-can-t-be-later-than-enddate","errorCode":null,"errorMessage":"startDate can't be later than endDate","messagePattern":"startDate can't be later than endDate","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java","lineNumber":111,"sourceCode":"                        mPickerOptions.timeSelectChangeListener.onTimeSelectChanged(date);\n                    } catch (ParseException e) {\n                        e.printStackTrace();\n                    }\n                }\n            });\n        }\n\n        wheelTime.setLunarMode(mPickerOptions.isLunarCalendar);\n\n        if (mPickerOptions.startYear != 0 && mPickerOptions.endYear != 0\n                && mPickerOptions.startYear <= mPickerOptions.endYear) {\n            setRange();\n        }\n\n        //若手动设置了时间范围限制\n        if (mPickerOptions.startDate != null && mPickerOptions.endDate != null) {\n            if (mPickerOptions.startDate.getTimeInMillis() > mPickerOptions.endDate.getTimeInMillis()) {\n                throw new IllegalArgumentException(\"startDate can't be later than endDate\");\n            } else {\n                setRangDate();\n            }\n        } else if (mPickerOptions.startDate != null) {\n            if (mPickerOptions.startDate.get(Calendar.YEAR) < 1900) {\n                throw new IllegalArgumentException(\"The startDate can not as early as 1900\");\n            } else {\n                setRangDate();\n            }\n        } else if (mPickerOptions.endDate != null) {\n            if (mPickerOptions.endDate.get(Calendar.YEAR) > 2100) {\n                throw new IllegalArgumentException(\"The endDate should not be later than 2100\");\n            } else {\n                setRangDate();\n            }\n        } else {//没有设置时间范围限制，则会使用默认范围。\n            setRangDate();\n        }","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/Bigkoo/Android-PickerView/blob/e200d8c063aa2568d728854c048340ad2e4e0c0b/pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java#L93-L129","documentation":"TimePickerView.initWheelTime throws this IllegalArgumentException when a custom time range was configured via setRangDate/Builder with a startDate whose time is after the endDate. The wheels cannot be initialized with an inverted range, so construction fails immediately.","triggerScenarios":"Building a TimePickerView with .setRangDate(startDate, endDate) (or setStartDate/setEndDate) where startDate.getTimeInMillis() > endDate.getTimeInMillis(), e.g. swapped argument order.","commonSituations":"Swapping start/end parameters accidentally; computing both dates dynamically (e.g. 'now - 1y' and 'now') where rounding makes start end up after end; loading dates from config/user input without ordering them.","solutions":["Swap the two Calendar arguments so the earlier one is passed as startDate","Compare the Calendars and order them programmatically before building the picker","Clamp start to at most end if the two come from independent inputs"],"exampleFix":"// before\npvTime.setRangDate(endDate, startDate); // swapped -> throws\n// after\nif (startDate.getTimeInMillis() > endDate.getTimeInMillis()) {\n    Calendar tmp = startDate; startDate = endDate; endDate = tmp;\n}\npvTime.setRangDate(startDate, endDate);","handlingStrategy":"validation","validationCode":"if (start != null && end != null && start.getTimeInMillis() > end.getTimeInMillis()) {\n    Calendar t = start; start = end; end = t; // reorder before setRangDate\n}","typeGuard":null,"tryCatchPattern":"try {\n    TimePickerView pv = new TimePickerView.Builder(ctx).setRangDate(start, end).build();\n} catch (IllegalArgumentException e) {\n    // rebuild with default range or reordered dates\n}","preventionTips":["Always pass the earlier Calendar as startDate","Normalize/swap range inputs from user config before configuring the picker","Unit-test range construction with dynamically computed dates"],"tags":["android","timepicker","date-range","invalid-argument-value"],"backgroundTag":"invalid-date-range","analyzedSha":"e200d8c063aa2568d728854c048340ad2e4e0c0b","analyzedAt":"2026-09-07T23:07:09.243Z","contentChangedAt":"2026-09-07T23:07:09.243Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}