web-dev-qa-db-fra.com

Calendrier add () vs roll () quand l'utilisons-nous?

Je sais que add() ajoute la quantité de temps spécifiée (signée) au champ horaire donné, en fonction des règles du calendrier.

Et roll() ajoute la seule unité de temps spécifiée (signée) sur le champ de temps donné sans changer les champs plus grands.

Je ne peux pas penser à une utilisation quotidienne de roll() Je ferais tout par add().

Pouvez-vous m'aider avec des exemples quand utilisons-nous roll() et quand add()?

MODIFIER 1

Joda les réponses ne sont pas acceptées!

52
Pentium10
  • add() - presque toujours, comme vous l'avez dit
  • roll() - par exemple, vous voulez "distribuer" les événements en un mois. L'algorithme peut être de procéder un certain nombre de jours et de placer l'événement, puis de poursuivre. Lorsque la fin du mois est atteinte, elle devrait recommencer depuis le début. D'où roll().
52
Bozho

Trouvé dans jGur

  • Calendar.roll ()
    Modifie une unité spécifique et laisse inchangées les unités "plus grandes" (en termes de temps-mois "plus grandes" que le jour). L'exemple d'API est que, étant donné la date du 31 août 1999, le calendrier (Calendar.MONTH, 8) donne le 30 avril 1999. Autrement dit, le JOUR a été modifié pour respecter le maximum d'avril, mais l'unité "plus grande", YEAR, était inchangé.

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

  • Calendar.add ()
    Le cas échéant, la prochaine unité "plus grande" changera. Autrement dit, étant donné une date du 31 août 1999, add (Calendar.MONTH, 8) donne le 30 avril 2000. add () force également un recalcul des millisecondes et de tous les champs.

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

Je posais simplement la même question (c'est ainsi que j'ai trouvé cette page) et quelqu'un sur mon lieu de travail (bravo, DCK) a eu une suggestion:

Les sélecteurs de date sur de nombreux téléphones intelligents (et autres interfaces similaires) "dérouleront" le jour du 31 au 1er sans modifier le mois, de la même manière pour le champ du mois.

Je ne peux pas penser à une autre utilisation de l'ATM et celle-ci pourrait être implémentée d'autres manières, mais au moins c'est un exemple!

Tim

6
Tim

Voici un exemple qui ne fonctionnera pas. La condition dans la boucle ne sera jamais remplie, car le rôle, une fois atteint le 31 janvier 2014, retournera au 1er janvier 2014.

    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