You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MaterialDatePicker日期范围选择器格式转换及类型转换错误解决

解决MaterialDatePicker日期范围选择器的ClassCastException问题

问题原因

你使用的是日期范围选择器(dateRangePicker),它返回的选中结果是Pair<Long, Long>类型(包含起始和结束时间的UTC毫秒数),但你在MaterialPickerOnPositiveButtonClickListener中错误指定了泛型为<Long>,导致系统尝试将Pair强制转换为Long,触发ClassCastException。

修正方案

  1. 修正监听器的泛型类型,改为Pair<Long, Long>以匹配日期范围选择器的返回值
  2. 分别提取起始、结束时间的毫秒数,转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 07:52:27