我正在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