为什么Android Calendar.set方法在第一次修改尝试时给出了错误的结果?

时间:2014-01-30 06:34:40

标签: java android calendar

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

1 个答案:

答案 0 :(得分:1)

什么是?我假设它是今天(第29位),因为你现在正在询问并使用getInstance()得到Calendar ...这意味着这是正确的;因为2月只有28天,所以它会延续到3月,因为2月只有28天。

来自Javadoc for Calendar

  

Calendar有两种解释日历字段的模式,lenient和non-lenient。当日历处于宽松模式时,它接受比它产生的更广泛的日历字段值。当日历重新计算get()返回的日历字段值时,所有日历字段都会进行规范化。例如,宽松的GregorianCalendar将MONTH == JANUARY,DAY_OF_MONTH == 32解释为2月1日。

一旦发生这种情况......就像你说的那样一切都很完美,因为DAY_OF_MONTH现在已经从1月29日到3月1日正常化了