我见过有关Calendar对象在Android / Java上的工作方式的其他帖子,我知道它的工作方式基于0的性质。这个问题似乎(对我而言)不同,所以我发布了一个新问题。请原谅我,如果这是一个骗局。
我遇到了一个返回数组的问题,我已经填充了每月的月份/年,直至1年前。例如,期望的结果是:
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月份之外,这一切都很好。我最终得到了1月,然后是3月份的2个参赛作品。所以:
我很困惑为什么会发生这种情况,因为如果我在monthsAgo
对象上放置一个监视器,我可以看到月份值设置为1,即2月归因于Calendar
对象是基于0的数组,但是当我调用monthsAgo.get(Calendar.MONTH)
时它返回2.否则数组的其余部分看起来很好并且是期望的结果。
我可能在这里错过了一些简单的东西,我怀疑它与1月0和2月是1有关,但我不能把它拼凑起来。
答案 0 :(得分:2)
而不是monthsAgo.set(Calendar.MONTH, month - i);
,请尝试monthsAgo.add(Calendar.MONTH, -i);
。问题在于(如果你现在正在执行它),一旦一切都正常化,你将在2013年2月29日(内部)结束,这将成为3月1日。您需要查看日历及其set
,add
和roll
方法的文档,但在这种情况下,我认为add
就是您想要的。