MaterialDatePicker日期范围选择器格式转换及类型转换错误解决
解决MaterialDatePicker日期范围选择器的ClassCastException问题
问题原因
你使用的是日期范围选择器(dateRangePicker),它返回的选中结果是Pair<Long, Long>类型(包含起始和结束时间的UTC毫秒数),但你在MaterialPickerOnPositiveButtonClickListener中错误指定了泛型为<Long>,导致系统尝试将Pair强制转换为Long,触发ClassCastException。
修正方案
- 修正监听器的泛型类型,改为
Pair<Long, Long>以匹配日期范围选择器的返回值 - 分别提取起始、结束时间的毫秒数,转换为
mm/dd/yyyy格式的字符串后存入独立变量
修正后的完整代码
// 初始化日期范围选择器,明确泛型为Pair<Long, Long> MaterialDatePicker<Pair<Long, Long>> materialDatePicker = MaterialDatePicker.Builder.dateRangePicker() .setSelection(Pair.create(thisMonthInUtcMilliseconds(), todayInUtcMilliseconds())) .build(); materialDatePicker.show(getSupportFragmentManager(), "MATERIAL_DATE_PICKER"); // 修正监听器泛型,接收Pair类型的选中结果 materialDatePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>() { @Override public void onPositiveButtonClick(Pair<Long, Long> selection) { // 定义目标格式的日期格式化器,指定UTC时区避免偏移 SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy", Locale.getDefault()); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); // 处理起始日期 Calendar startCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); startCalendar.setTimeInMillis(selection.first); String startDate = dateFormat.format(startCalendar.getTime()); // 处理结束日期 Calendar endCalendar = Calendar.getInstance(TimeZone.getTimeZone("UTC")); endCalendar.setTimeInMillis(selection.second); String endDate = dateFormat.format(endCalendar.getTime()); // 示例:使用格式化后的日期 Toast.makeText(ManageCustomerByAgent.this, "起始日期:" + startDate + " | 结束日期:" + endDate, Toast.LENGTH_SHORT).show(); CustomerCreationFromDate.setText(startDate); // 可添加结束日期的输入框赋值:CustomerCreationToDate.setText(endDate); } });
关键注意点
- 日期范围选择器的
setSelection参数和返回结果均为Pair<Long, Long>,泛型必须严格匹配 - 格式化时指定UTC时区,避免本地时区导致的日期显示偏差
SimpleDateFormat中MM代表两位数月份,mm代表分钟,注意不要混淆
内容的提问来源于stack exchange,提问作者Vikas Kumar
相关产品推荐
相关产品推荐

