web-dev-qa-db-ja.com

カレンダーのadd()とroll()をいつ使用しますか?

add()は、カレンダーのルールに基づいて、指定された(署名された)時間を特定の時間フィールドに追加することを知っています。

roll()は、指定された(署名された)単一の時間単位を指定された時間フィールドに追加しますより大きなフィールドを変更せずに

roll()の日常的な使用法を考えることはできません。add()ですべてを行います。

roll()を使用する場合とadd()を使用する場合の例を教えてください。

編集1

Joda回答は受け入れられません!

52
Pentium10
  • add()-ほとんどいつも、あなたが言ったように
  • roll()-たとえば、1か月でイベントを「分配」したい場合。アルゴリズムは、数日先に進んでイベントを配置し、さらに先に進むことです。月末に達すると、最初からやり直す必要があります。したがって、roll()
52
Bozho

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.

29
Menda

私は同じ質問(このページを見つけた方法です)を尋ねていましたが、職場の誰か(よくやった、DCK)が提案を出しました:

多くのスマートフォン(および他の同様のインターフェース)の日付セレクターは、月フィールドを同様に、月を変更せずに31日から1日まで「ロール」します。

別のATMを使用することは考えられません。これは他の方法で実装できますが、少なくとも例です。

ティム

6
Tim

動作しない例を次に示します。ロールは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);
    }
2
Jadiel de Armas