我正在Android上创建自己的日历UI实现。其功能之一是通过简单地将日历月份值增加或减少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(1月),年= 2014。
首次点击“下一步”按钮时,month
值增加1. currentCalendar
月份值设置为:
this.currentCalendar.set(Calendar.MONTH, month); // debugger says month is 1
但是,当我尝试显示currentCalendar
的月份值时,调试器会说月份值是2(3月)而不是1(2月)。这仅在第一次单击“下一步”按钮时发生。下次单击“下一个”和“上一个”按钮时,日历月将完美变化。
代码有什么问题吗?
PS:我正在为currentCalendar
使用java.util.Calendar。
答案 0 :(得分:1)
什么是天?我假设它是今天(第29位),因为你现在正在询问并使用getInstance()
得到Calendar
...这意味着这是正确的;因为2月只有28天,所以它会延续到3月,因为2月只有28天。
Calendar有两种解释日历字段的模式,lenient和non-lenient。当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值。当日历重新计算get()返回的日历字段值时,所有日历字段都会进行规范化。例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。
一旦发生这种情况......就像你说的那样一切都很完美,因为DAY_OF_MONTH现在已经从1月29日到3月1日正常化了