Android中将LocalDate传入DatePicker显示月份多1问题如何解决
问题原因
Android原生DatePickerDialog的月份取值规则是0基计数:0对应1月,1对应2月,以此类推,11对应12月。而Java 8+时间API里LocalDate.getMonthValue()返回的是1基计数:1对应1月,12对应12月。你直接把getMonthValue()的返回值传入DatePickerDialog构造方法,就会出现默认显示月份比实际月份多1的问题。
你当前选中后回显看起来正确属于歪打正着:因为弹窗默认显示的月份比实际多1,你直接确认的话,onDateSet返回的0基月份值刚好等于你实际需要的1基月份值,但是只要手动调整过月份再确认,回显的月份就会出现少1的错误。
修复方案
修改两处代码即可:
- 初始化
DatePickerDialog时,传入的月份参数减1,适配0基计数规则 onDateSet回调中设置文本时,返回的月份参数加1,转为日常使用的1基计数
修改后的完整代码如下:
public View.OnClickListener openDatePicker = new View.OnClickListener() { @Override public void onClick(View view) { // 原逻辑中转字符串再解析属于多余操作,可直接获取当前LocalDate LocalDate localDate = LocalDate.now(); openDatePickerForParty(localDate); } }; public void openDatePickerForParty(LocalDate givenLocalDT){ DatePickerDialog startDateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker datePicker, int year, int month, int day) { // 回调返回的是0基月份,显示时加1转为正常计数 AddNewEventScreen.this.textViewEventDate.setText(year + "-"+ (month + 1) + "-" + day); } }, givenLocalDT.getYear(), // 传入构造方法的月份减1,适配DatePickerDialog的0基规则 givenLocalDT.getMonthValue() - 1, givenLocalDT.getDayOfMonth()); Log.i("thismonth", String.valueOf(givenLocalDT.getMonthValue())); startDateDialog.show(); }
内容的提问来源于stack exchange,提问作者craftdeer
相关产品推荐
相关产品推荐

