我正在Android上创建自己的日历UI实现。它的功能之一是通过简单地将Calendar的月份值增加或减少1来更改当前查看的月份日历。

默认日历值使用以下方法初始化:

this.currentCalendar = Calendar.getInstance(Locale.US);


以下是用于更改currentCalendar月值的onClick侦听器实现。

@Override
public void onClick(View v) {
    int month = this.currentCalendar.get(Calendar.MONTH);
    int year = this.currentCalendar.get(Calendar.YEAR);
    SimpleDateFormat sdf = new SimpleDateFormat("MMM yyyy", Locale.US);
    switch(v.getId()) {
        case R.id.calendarNextMonthButton: // Next Button Clicked
            month++;
            break;
        case R.id.calendarPrevMonthButton: // Prev Button Clicked
            month--;
            break;
    }
    this.currentCalendar.set(Calendar.MONTH, month);
    Log.d("month", String.valueOf(this.currentCalendar.get(Calendar.MONTH)));
    this.monthYearText = (TextView) this.v.findViewById(R.id.calendarMonthYearText);
    this.monthYearText.setText(sdf.format(this.currentCalendar.getTime()));
}


初始化完成后,日历会正确显示currentCalendar月和年的值,例如月份= 0(一月),年份= 2014。
第一次单击“下一步”按钮时,month值增加了1。currentCalendar月的值使用以下方法设置:

this.currentCalendar.set(Calendar.MONTH, month); // debugger says month is 1


但是,当我尝试显示currentCalendar的月份值时,调试器说月份值为2(3月)而不是1(2月)。这仅在第一次单击“下一步”按钮时发生。下次我单击“下一步”和“上一步”按钮时,日历月的变化非常完美。

代码有什么问题吗?

PS:我正在将java.util.Calendar用于currentCalendar

最佳答案

星期几我假设今天是您今天要问的(第29个),并使用getInstance()来获取Calendar ...,这是正确的;当您添加一个月时,它将滚动到三月,因为二月只有28天。

Javadoc for Calendar


  日历具有两种解释日历字段的模式:宽松和不宽松。日历处于宽松模式时,它接受的日历字段值范围比生成的范围大。当Calendar重新计算日历字段值以通过get()返回时,所有日历字段都将被标准化。例如,宽大的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。


一旦发生这种情况,...一切将按您所说的那样完美地进行,因为从2月29日到3月1日,DAY_OF_MONTH现在为1

10-07 19:19