1

我看过其他关于日历对象在 Android/Java 上的工作方式的帖子,并且我知道它工作方式的基于 0 的性质。这个问题(对我来说)似乎有所不同,所以我发布了一个新问题。如果是骗子请见谅。

我在返回一个数组时遇到问题,该数组在一年前的每个月中都填充了月/年。例如,期望的结果是:

  • 2013 年 7 月
  • 2013年六月
  • 2013 年 5 月
  • ...
  • 2012 年 8 月

PastMonth是一个简单的对象,由两个整数、月/年和一个字符串表示 - “2013 年 7 月”组成。

Calendar rightNow = Calendar.getInstance();

PastMonth[] dateList = new PastMonth[12];
dateList[0] = new PastMonth(rightNow.get(Calendar.MONTH), rightNow.get(Calendar.YEAR));
for (int i=1; i<=11; i++) {
    Calendar monthsAgo = Calendar.getInstance();
    int month = monthsAgo.get(Calendar.MONTH);
    monthsAgo.set(Calendar.MONTH, month - i);
    dateList[i] = new PastMonth(monthsAgo.get(Calendar.MONTH), monthsAgo.get(Calendar.YEAR));
}

除了二月,这一切都很好。我以一月结束,然后是三月的 2 个条目。所以:

  • ...
  • 2013年4月
  • 2013 年 3 月
  • 2013 年 3 月
  • 2013 年 1 月
  • 2012 年 12 月
  • ...

我很困惑为什么会发生这种情况,因为如果我在monthsAgo对象上放置手表,我可以看到月份值设置为 1,这是 2 月,因为Calendar对象是基于 0 的数组,但是当我调用monthsAgo.get(Calendar.MONTH)它时返回 2。否则数组的其余部分看起来很好,是预期的结果。

我可能在这里错过了一些简单的事情,我怀疑这与一月为 0 和二月为 1 有关,但我无法将其拼凑在一起。

4

1 回答 1

2

而不是monthsAgo.set(Calendar.MONTH, month - i);,尝试monthsAgo.add(Calendar.MONTH, -i);。问题是(如果您现在正在执行它),您将在 2013 年 2 月 29 日(内部)结束,这成为 3 月 1 日,一旦一切都正常化。您需要查看 Calendar 及其setaddroll方法的文档,但在这种情况下,我认为add这就是您想要的。

于 2013-07-29T21:55:37.687 回答