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

时间:2010-03-23 22:41:47

标签: java calendar

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

roll()在给定的时间字段上添加指定的(已签名)单个时间单位,而不更改更大的字段。

我想不出roll()的日常用法我会按add()做所有事情。

我们可以在使用roll()add()时使用示例帮助我吗?

编辑1

Joda 不接受答案!

4 个答案:

答案 0 :(得分:50)

  • add() - 几乎总是如你所说
  • roll() - 例如,您希望在一个月内“分发”事件。算法可以进行若干天并放置事件,然后继续进行。当达到月末时,它应该从头开始。因此roll()

答案 1 :(得分:27)

jGuru

中找到
  
      
  • 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);
    }