我知道add()
会根据日历的规则将指定(签名)的时间量添加到给定时间字段。
roll()
在给定的时间字段上添加指定的(已签名)单个时间单位,而不更改更大的字段。
我想不出roll()
的日常用法我会按add()
做所有事情。
我们可以在使用roll()
和add()
时使用示例帮助我吗?
编辑1
Joda 不接受答案!
答案 0 :(得分:50)
add()
- 几乎总是如你所说roll()
- 例如,您希望在一个月内“分发”事件。算法可以进行若干天并放置事件,然后继续进行。当达到月末时,它应该从头开始。因此roll()
。答案 1 :(得分:27)
- Calendar.roll()
更改特定单位 并留下“更大”(就时间月而言) 比单日“更大”的单位不变。 API示例就是这样 给定日期为1999年8月31日, 滚动(Calendar.MONTH,8)得出 1999年4月30日。也就是说,DAY是 改为满足四月的最大值,但是 年份较大的单位是 不变。
roll(): Rolls up 8 months here i.e., adding 8 months to Aug will result in Apr but year remains unchanged(untouched).
- Calendar.add()
会导致 下一个“更大”的单位要改变,如果 必要。也就是说,给定日期 1999年8月31日,添加(Calendar.MONTH, 8)产量2000年4月30日.add()也 强制重新计算毫秒数 和所有领域。
add(): Adds months to the current date i.e., adding 8 months to Aug will give Apr of Next Year, hence forces the Year change.
答案 2 :(得分:6)
我只是问同样的问题(这就是我发现这个页面的方式)和我工作的人(干得好,DCK)提出了一个建议:
许多智能手机(和其他类似界面)上的日期选择器将从第31天到第1天“滚动”而不改变月份,类似于月份字段。
我想不出另一种使用ATM,这种方法可以通过其他方式实现,但至少它是一个例子!
添
答案 3 :(得分:2)
这是一个不起作用的例子。循环中的条件永远不会得到满足,因为一旦到2014年1月31日,卷将回到2014年1月1日。
Calendar start=new GregorianCalendar();
start.set(Calendar.YEAR, 2014);
start.set(Calendar.MONTH, 0);
start.set(Calendar.DAY_OF_MONTH, 1);
//January 2, 2014
Calendar end=new GregorianCalendar();
end.set(Calendar.YEAR, 2014);
end.set(Calendar.MONTH, 1);
end.set(Calendar.DAY_OF_MONTH, 2);
//February 2, 2014
while (start.getTime().before(end.getTime())){
start.roll(Calendar.DATE, 1);
}