Android如何获取MaterialDatePicker日期选择器选中的起止日期
MaterialDatePicker范围选择回调提取起止日期方案
你没法直接调用Pair的取值方法,是因为注册监听器时没有指定对应泛型,回调入参默认被识别为Object类型。不需要解析toString()返回的字符串,通过类型匹配就能直接取值:
- 日期范围选择模式下,回调返回的selection实际类型为
androidx.core.util.Pair<Long, Long>,其中first属性存储选中起始日期的UTC毫秒级时间戳,second属性存储选中结束日期的UTC毫秒级时间戳。 - 注册监听器时给
MaterialPickerOnPositiveButtonClickListener指定Pair<Long, Long>泛型,入参会自动识别为对应Pair类型,不需要手动强转就能直接提取两个时间戳。
正确实现代码
dateRangePicker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Pair<Long, Long>>() { @Override public void onPositiveButtonClick(Pair<Long, Long> selection) { if (selection == null) return; // 提取起止时间戳 long startTimestamp = selection.first; long endTimestamp = selection.second; // 如需转换为本地Date对象,必须指定UTC时区,否则会出现日期偏移 Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); utcCal.setTimeInMillis(startTimestamp); Date startDate = utcCal.getTime(); utcCal.setTimeInMillis(endTimestamp); Date endDate = utcCal.getTime(); } });
注意事项
- 不要用解析
toString()字符串的方式提取日期,不同版本组件的Pair字符串输出规则可能变动,很容易导致解析逻辑失效 - 组件返回的时间戳基于UTC零时区计算,转本地日期时如果用系统默认时区初始化日历实例,大概率会出现选中日期和解析结果差1天的问题
内容的提问来源于stack exchange,提问作者ArunJose
相关产品推荐
相关产品推荐

