You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 14:38:14