MaterialCalendarView获取MONTH、YEAR等日期字段值异常问题
问题原因与修复方案
你遇到的问题是典型的混淆了Calendar类的静态常量和实例字段值,这是新手使用Java Calendar类时很容易踩的坑,我来给你拆解清楚:
错误根源
Java的Calendar类里,MONTH、YEAR、DAY_OF_MONTH这些都是静态常量——它们的作用是作为参数传递给get()方法,用来指定你要获取的日期字段类型,而不是直接存储当前Calendar实例的日期值。
举个直观的例子:
Calendar.MONTH的实际固定值是2(这是月份字段的索引标识),不是当前实例的真实月份Calendar.YEAR的实际固定值是1Calendar.DAY_OF_MONTH的实际固定值是5
你直接调用calendar.MONTH拿到的就是这些固定常量值,自然和日志里显示的Calendar实例的真实日期完全不符。
修复后的代码
把所有直接访问静态常量的地方,改成调用Calendar.get(int field)方法,传入对应的静态常量作为参数,就能拿到真实的日期值了:
calendarView = (CalendarView) view.findViewById(R.id.calendarView); calendarView.setOnPreviousButtonClickListener(new OnNavigationButtonClickListener() { @Override public void onClick() { Calendar calendar = calendarView.getCurrentPageDate(); // 用get方法获取实际月份和年份,注意Calendar月份从0开始,要+1才是常规的1-12月 int previousMonth = calendar.get(Calendar.MONTH) + 1; int previousYear = calendar.get(Calendar.YEAR); Log.i(TAG, "--- previous month: " + previousMonth + "/" + previousYear + " - " + calendar); } }); calendarView.setOnForwardButtonClickListener(new OnNavigationButtonClickListener() { @Override public void onClick() { Calendar calendar = calendarView.getCurrentPageDate(); int nextMonth = calendar.get(Calendar.MONTH) + 1; int nextYear = calendar.get(Calendar.YEAR); Log.i(TAG, "--- next month: " + nextMonth + "/" + nextYear + " - " + calendar); } }); calendarView.setOnDayClickListener(new OnDayClickListener() { @Override public void onDayClick(EventDay eventDay) { Calendar clickedDayCalendar = eventDay.getCalendar(); // 用get方法获取实际的日期数值 int clickedDay = clickedDayCalendar.get(Calendar.DAY_OF_MONTH); Log.i(TAG, "------- clicked day: " + clickedDay + " - " + clickedDayCalendar); } });
额外提示
别忘了Calendar的月份是从0开始计数的(0代表1月,11代表12月),所以如果你要给用户展示常规的1-12月,记得在获取到的月份值上加1,就像上面代码里做的那样。
内容的提问来源于stack exchange,提问作者codeinprogress
相关产品推荐
相关产品推荐

