【发布时间】:2016-04-07 20:09:37
【问题描述】:
我知道add() 根据日历的规则将指定(签名)的时间量添加到给定的时间字段。
并且roll() 在给定的时间字段上添加指定的(签名的)单个时间单位而不更改更大的字段。
我想不出roll() 的日常用法我会用add() 做所有事情。
你能帮我举个例子,我们什么时候使用roll(),什么时候使用add()?
编辑 1
Joda 答案不被接受!
【问题讨论】:
我知道add() 根据日历的规则将指定(签名)的时间量添加到给定的时间字段。
并且roll() 在给定的时间字段上添加指定的(签名的)单个时间单位而不更改更大的字段。
我想不出roll() 的日常用法我会用add() 做所有事情。
你能帮我举个例子,我们什么时候使用roll(),什么时候使用add()?
编辑 1
Joda 答案不被接受!
【问题讨论】:
add() - 几乎总是如你所说roll() - 例如你想在一个月内“分配”事件。该算法可能会进行几天并放置事件,然后继续进行。到了月底,应该从头开始。因此roll()。【讨论】:
发现于jGuru
- Calendar.roll()
更改特定单位 并留下“更大”(就时间-月而言 比天“大”)单位不变。 API示例是 给定日期为 1999 年 8 月 31 日, 滚动 (Calendar.MONTH, 8) 收益率 1999 年 4 月 30 日。也就是说,这一天是 更改为满足 4 月的最大值,但 “更大”的单位,YEAR,是 不变。
roll(): Rolls up 8 months here i.e., adding 8 months to Aug will result in Apr but year remains unchanged(untouched).
- 日历.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.
【讨论】:
我只是问了同样的问题(这就是我找到此页面的方式),而我工作场所的某个人(干得好,DCK)提出了一个建议:
许多智能手机(和其他类似界面)上的日期选择器会将日期从 31 日“滚动”到 1 日,而不会更改月份,月份字段也是如此。
我想不出另一种使用 ATM,而这个可以用其他方式实现,但至少它是一个例子!
提姆
【讨论】:
这是一个不起作用的示例。循环中的条件永远不会满足,因为滚动一旦到达 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);
}
【讨论】: