【问题标题】:Why Android Calendar.set method is giving wrong result on first modification attempt?为什么 Android Calendar.set 方法在第一次修改尝试时给出错误的结果?
【发布时间】:2014-01-30 06:34:40
【问题描述】:

我正在 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(一月),年 = 2014。 当我第一次单击“下一步”按钮时,month 值增加了 1。currentCalendar 月份值设置使用:

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

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

代码有什么问题吗?

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

【问题讨论】:

    标签: java android calendar


    【解决方案1】:

    一天是什么日子?我假设它是今天(29 日),正如你现在所问的那样,并使用getInstance() 来获取Calendar ...这意味着这是正确的;当您添加一个月时,它会滚动到 3 月,因为 2 月只有 28 天。

    来自Javadoc for Calendar

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

    一旦发生这种情况......一切都如你所说的那样完美,因为 DAY_OF_MONTH 现在是 1,已从 2 月 29 日到 3 月 1 日进行了标准化

    【讨论】:

    • 是的,今天是 2014 年 1 月 29 日。哇,我没想到。在更改月份之前,我将 currentCalendar day-of-month 值设置为 1。现在它运行良好。感谢您在这方面为我节省了时间。
    • @Aryo 很高兴我能帮上忙。您还可以使用 .add().roll() 进行更精细的控制 - 请查看 Javadoc 主要描述中的最后一段。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2012-12-06
    • 2019-08-24
    • 2020-02-05
    相关资源
    最近更新 更多