首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MaterialDatePicker返回错误值

MaterialDatePicker返回错误值
EN

Stack Overflow用户
提问于 2020-09-17 00:44:24
回答 2查看 261关注 0票数 3

我在android中使用MaterialDatePicker让用户能够选择出生日期,在选择日期之后,返回的值是带有所选日期的时间戳的long (自01/01/1970以来的毫秒)。问题是所得到的结果略有错误,例如:如果用户选择日期10/05/1998 (1998年10月1日),返回的日期是该日期的前一天,即日历返回10/04 / 1998 (1998年10月4日)。

我的代码:

代码语言:javascript
复制
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 )仅在一天前就有了选定的日期。我怎么才能解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2022-03-19 19:45:46

[2022年工作解决方案]

事实证明,MaterialDatePicker使用UTC时间格式,这意味着它不包含任何时区信息,因为官方声明为这里

这意味着我们必须在UTC日期时间专区日期时间之间进行一些转换工作,其想法是使用LocalDateTime api:

为了在选择器上显示正确的日期,我们需要将区域日期-时间转换为UTC日期-时间:

代码语言:javascript
复制
Zone date-time (Long) -> zone LocalDateTime (object) -> UTC date-time (object)-> UTC date-time (Long).

2.为了从选择器获取区域日期-时间,我们需要将UTC日期-时间转换为区域日期-时间:。

代码语言:javascript
复制
UTC date-time (Long) -> UTC LocalDateTime (object) -> zone date-time (object) -> zone date-time (Long)
  1. 创建帮助扩展函数: LocalDateTime.ofInstant(Instant.ofEpochMilli(this),Long.toLocalDateTime() =ZoneId.systemDefault() Long.toUTCLocalDateTime() =Long.toUTCLocalDateTime ZoneId.ofOffset("UTC",ZoneOffset.UTC))
  2. 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,"") }

演示:https://youtu.be/9YWr3fgQ214

票数 2
EN

Stack Overflow用户

发布于 2022-03-19 21:08:31

这是因为DatePicker索引从0开始的月份覆盖此方法。

代码语言:javascript
复制
override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
    datePickerListener.onDateSet(view,year,month+1,dayOfMonth)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63929730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档