add()
は、カレンダーのルールに基づいて、指定された(署名された)時間を特定の時間フィールドに追加することを知っています。
roll()
は、指定された(署名された)単一の時間単位を指定された時間フィールドに追加しますより大きなフィールドを変更せずに
roll()
の日常的な使用法を考えることはできません。add()
ですべてを行います。
roll()
を使用する場合とadd()
を使用する場合の例を教えてください。
編集1
Joda回答は受け入れられません!
add()
-ほとんどいつも、あなたが言ったようにroll()
-たとえば、1か月でイベントを「分配」したい場合。アルゴリズムは、数日先に進んでイベントを配置し、さらに先に進むことです。月末に達すると、最初からやり直す必要があります。したがって、roll()
。jGur で見つかりました
- Calendar.roll()
特定の単位を変更し、「より大きい」単位(時間-月の面では日よりも「大きい」単位)を変更しません。 APIの例は、1999年8月31日の日付が与えられ、(Calendar.MONTH、8)でローリングすると1999年4月30日となります。つまり、DAYは4月の最大値を満たすように変更されました変わらなかった。
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日の日付を指定すると、add(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);
}