2010-03-23 8 views
48

Wiem, że add() dodaje określoną (podpisaną) ilość czasu do danego pola czasu, w oparciu o reguły kalendarza.Kalendarz dodać() vs roll(), kiedy go używamy?

I roll() dodaje określoną (podpisaną) pojedynczą jednostkę czasu w danym polu czasu bez zmiany większych pól.

Nie mogę myśleć o codziennym użyciu roll() Zrobiłbym wszystko, by add().

Czy możesz mi pomóc z przykładami, kiedy używamy roll() i kiedy add()?

EDIT 1

Joda odpowiedzi nie są przyjmowane!

Odpowiedz

48
  • add() - prawie zawsze, jak pan powiedział
  • roll() - na przykład chcesz, aby „zwolnić” zdarzeń w jednym miesiącu. Algorytm może potrwać kilka dni i umieścić wydarzenie, a następnie przejść dalej. Po osiągnięciu końca miesiąca powinno zacząć się od początku. Stąd roll().
24

Znalezione w jGuru

  • Calendar.roll()
    Zmienia konkretną jednostkę i pozostawia 'większy' (pod względem czasu miesiąca jest 'większy' niż jednostek dziennie) niezmienione. Przykład interfejsu API to: z datą 31 sierpnia 1999, walcowanie według (Calendar.MONTH, 8) daje 30 kwietnia 1999. Oznacza to, że DZIEŃ został zmieniony na maksimum kwietnia, ale "większy "jednostka, ROK, była niezmieniona.

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

  • Calendar.add()
    spowoduje obok 'większy' jednostka zmienić, jeśli konieczne. Oznacza to, że biorąc pod uwagę datę 31 sierpnia 1999, dodać (Calendar.MONTH, 8) daje 30 kwietnia 2000. add() również wymusza ponowną kalkulację milisekund i wszystkich pól.

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.

6

właśnie zadaje to samo pytanie (co jest jak znalazłem tej stronie) i kogoś na moje miejsce pracy (dobrze, DCK) wymyślił sugestia:

Selektory daty na wielu smartfonach (i innych podobnych interfejsach) "przetoczą" dzień z 31. na 1. bez zmiany miesiąca, podobnie jak dla pola miesiąca.

Nie mogę myśleć o innym używaniu ATM, a ten może być zrealizowany w inny sposób, ale przynajmniej jest to przykład!

Tim

2

Oto przykład, który nie zadziała. Warunek w pętli nigdy nie zostanie spełniony, ponieważ rolka, po osiągnięciu 31 stycznia 2014 r., Powróci do 1 stycznia 2014 r.

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); 
    }