日历add()vs roll()我们什么时候使用它?

我知道add()根据日历的规则将指定的(有符号的)时间量添加到给定的时间字段。

roll()在给定的时间域上添加指定的(有符号的)单个时间单位, 而不改变更大的域。

我不能想到roll()的日常用法我会通过add()来做所有事情。

当我们使用roll()add()时,你能用例子来帮助我吗?

编辑1

乔达的答案不被接受!

  • add() – 几乎总是如你所说
  • roll() – 例如你想在一个月内“分配”事件。 该algorithm可能需要进行数天并放置事件,然后继续。 当月底达到时,应该从头开始。 因此roll()

在jGurufind

  • Calendar.roll()
    改变一个特定的单位,并保持“较大”(在时间月比“一天比较大”)单位不变。 API的例子是1999年8月31日的date,1999年4月30日(Calendar.MONTH,8)产生的收益率。也就是说,DAY被改变为满足4月份的最大值,但“更大”的单位YEAR,没有变化。

roll(): Rolls up 8 months here ie, adding 8 months to Aug will result in Apr but year remains unchanged(untouched).

  • Calendar.add()
    如有必要,将导致下一个“大型”单位发生变化。 也就是说,给定1999年8月31日的date,2000年4月30日添加(Calendar.MONTH,8)。add()还强制重新计算毫秒和所有字段。

add(): Adds months to the current date ie, adding 8 months to Aug will give Apr of Next Year, hence forces the Year change.

我只是问了同样的问题(我是如何find这个页面的),在我工作的地方有一个人(干得好,DCK)提出了一个build议:

许多智能手机(和其他类似接口)上的dateselect器将从第31日到第1日“滚动”,而不改变月份,类似于月份字段。

我想不出另外一个使用自动柜员机,这个可以用其他方式来实现,但至less这是一个例子!

蒂姆

这是一个不起作用的例子。 回路中的状况将永远不会得到满足,因为一旦到达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); }