我在android中使用MaterialDatePicker让用户能够选择出生日期,在选择日期之后,返回的值是带有所选日期的时间戳的long (自01/01/1970以来的毫秒)。问题是所得到的结果略有错误,例如:如果用户选择日期10/05/1998 (1998年10月1日),返回的日期是该日期的前一天,即日历返回10/04 / 1998 (1998年10月4日)。
我的代码:
Calendar calendar = Calendar.getInstance();
MaterialDatePicker.Builder<Long> builder =
MaterialDatePicker.Builder.datePicker();
MaterialDatePicker<Long> picker = builder.build();
picker.show(getChildFragmentManager(), picker.toString());
picker.addOnPositiveButtonClickListener(new MaterialPickerOnPositiveButtonClickListener<Long>() {
@Override
public void onPositiveButtonClick(Long selection) {
calendar.setTimeInMillis(selection);
SimpleDateFormat simpleDateFormat = new
SimpleDateFormat("dd/MM//yyyy",Locale.getDefault());
txtBirthDate.setText(simpleDateFormat.format(calendar.getTime()));
}
});calendar实例(现在使用timeInMillis )仅在一天前就有了选定的日期。我怎么才能解决这个问题?
发布于 2022-03-19 19:45:46
[2022年工作解决方案]
事实证明,MaterialDatePicker使用UTC时间格式,这意味着它不包含任何时区信息,因为官方声明为这里。
这意味着我们必须在UTC日期时间和专区日期时间之间进行一些转换工作,其想法是使用LocalDateTime api:
为了在选择器上显示正确的日期,我们需要将区域日期-时间转换为UTC日期-时间:。
Zone date-time (Long) -> zone LocalDateTime (object) -> UTC date-time (object)-> UTC date-time (Long).2.为了从选择器获取区域日期-时间,我们需要将UTC日期-时间转换为区域日期-时间:。
UTC date-time (Long) -> UTC LocalDateTime (object) -> zone date-time (object) -> zone date-time (Long)MaterialDatePicker中显示Fragment:
私有setSelection(viewModel.dateLong.value.toLocalDateTime().atZone(ZoneId.ofOffset("UTC",showDatePicker() { val datePicker = MaterialDatePicker.Builder.datePicker().run { setTitleText("Select“)//setSelection(MaterialDatePicker.todayInUtcMilliseconds()) //显示今天的date build() } datePicker.addOnPositiveButtonClickListener { val dateLong = datePicker.selection!!.toUTCLocalDateTime().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli() viewModel.updateDateLong(dateLong) } datePicker.show(childFragmentManager,"") }发布于 2022-03-19 21:08:31
这是因为DatePicker索引从0开始的月份覆盖此方法。
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
datePickerListener.onDateSet(view,year,month+1,dayOfMonth)
}https://stackoverflow.com/questions/63929730
复制相似问题