Android CalendarDatePickerDialogFragment日期选择后无法正确显示问题排查
问题分析与解决方案
嘿,我一眼就揪出问题所在了——你直接把dayOfMonth、monthOfYear这些单独的int数值传给SimpleDateFormat.format()方法,这完全用错了这个方法的逻辑!
核心问题
SimpleDateFormat.format()需要的是一个完整的时间对象(比如Date或者Calendar),它代表某个具体的时间点。你直接传单个的int值(比如19、6),方法会把这个数值当成从1970年1月1日00:00:00开始的毫秒数,这么小的数值转换后肯定是接近 epoch 时间的错误日期,这就是为啥你得不到选中的2020年7月19日。
另外还有个小坑:你用的DD是年中的第几天,不是月份里的日期,要表示月份里的日应该用小写的dd!
修正后的代码
下面是重写后的onDateSet方法,我加了详细注释帮你理解:
@Override public void onDateSet(CalendarDatePickerDialogFragment dialog, int year, int monthOfYear, int dayOfMonth) { // 第一步:把选中的年月日组合成一个完整的Calendar对象 Calendar selectedCalendar = Calendar.getInstance(); // 注意:Calendar的月份是0-based(0=1月,11=12月),和onDateSet的monthOfYear参数一致,不用加1 selectedCalendar.set(year, monthOfYear, dayOfMonth); // 第二步:定义需要的格式化器,注意用dd表示月份中的日期 SimpleDateFormat weekFormat = new SimpleDateFormat("EEEE", Locale.forLanguageTag("tr-TR")); SimpleDateFormat monthFormat = new SimpleDateFormat("MMMM", Locale.forLanguageTag("tr-TR")); SimpleDateFormat dayFormat = new SimpleDateFormat("dd", Locale.forLanguageTag("tr-TR")); // 第三步:用完整的Calendar对象(或其对应的Date)来格式化 String selectedWeekDay = weekFormat.format(selectedCalendar.getTime()); String selectedMonthName = monthFormat.format(selectedCalendar.getTime()); String selectedDay = dayFormat.format(selectedCalendar.getTime()); // 现在你可以正常打印或使用这些变量了 // 比如: Log.d("SelectedDate", String.format("星期:%s,月份:%s,日期:%s", selectedWeekDay, selectedMonthName, selectedDay)); }
额外说明
- 如果不需要日期带前导零(比如要显示
19而不是19,哦不对,比如要显示9而不是09),可以把dd改成d; - 要是你用的是Android API 24+,也可以用
java.time包下的LocalDate类来处理,代码会更简洁,但上面的写法兼容所有Android版本; - 最关键的一点:一定要确保你格式化的是完整的日期对象,而不是单个的年月日数值!
内容的提问来源于stack exchange,提问作者stakabekor
相关产品推荐
相关产品推荐

