2010-03-24 7 views
14

Je ne sais pas exactement quel champ utiliser lors de l'ajout de plus de 30 jours à un objet Java Calendar. Y a-t-il une différence entre Calendar.DAY_OF_MONTH et Calendar.DAY_OF_YEAR?ajouter plus de 30 jours avec la méthode add() de Calendar en Java

Exemple:

GregorianCalendar d = new GregorianCalendar(); 
d.add(Calendar.DAY_OF_YEAR, 90); 

vs

GregorianCalendar d = new GregorianCalendar(); 
d.add(Calendar.DAY_OF_MONTH, 90); 

Merci.

+0

Votre code implique que tous les mois ont 30 jours. – whiskeysierra

Répondre

17

Je ne pense pas que cela fasse une différence lorsque vous appelez ajouter. La distinction est importante lorsque vous appelez les getters.

Les deux méthodes fonctionnent bien, non? Pour plus de 30 jours, ainsi que des montants négatifs.

Le (certes compliqué) source GregorianCalendar # add a cette section:

case DAY_OF_MONTH: // synonym of DATE 
case DAY_OF_YEAR: 
case DAY_OF_WEEK: 
    break; 
+0

Merci pour la confirmation de la source. – Haes

+2

Le comportement de sur/sous-flux lors de l'utilisation de la méthode add est bien défini dans la documentation de l'API: "Le débordement se produit lorsqu'une valeur de champ dépasse sa plage et, par conséquent, le champ suivant est incrémenté ou décrémenté. ajusté de nouveau dans sa gamme. " Si le champ DAY_OF_MONTH est débordé, cela signifie que le champ MONTH (plus grand) est incrémenté et que le champ DAY_OF_MONTH est mis à 1 (réajusté dans sa plage valide). – jarnbjo

+0

@jarnbjo: et je pense que la même chose se produit exactement pour DAY_OF_YEAR, DAY_OF_WEEK et DATE. – Thilo

0

tl; dr

LocalDate.now(ZoneId.of("America/Montreal")) 
     .plusDays(30) 

Détails

beaucoup plus facile maintenant avec les classes java.time modernes qui supplante les anciennes classes Calendar & Date.

LocalDate

La classe LocalDate représente une valeur de date uniquement, sans temps de jour et sans fuseau horaire.

Un fuseau horaire est cruciale pour déterminer une date. Pour un moment donné, la date varie autour du globe par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu'encore "hier" dans Montréal Québec.

Spécifiez un proper time zone name dans le format de continent/region, tels que America/Montreal, Africa/Casablanca ou Pacific/Auckland. Ne jamais utiliser l'abréviation 3-4 lettres telles que EST ou IST car ils sont pas fuseaux horaires vrai, non standardisé, et même pas uniques (!).

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Vous pouvez ajouter un nombre de jours à cela.

LocalDate later = today.plusDays(30); 

Period

Vous pouvez représenter un laps de temps avec la classe Period.

Period thirtyDays = Period.ofDays(30); 

Vous pouvez effectuer des calculs de date en appelant plus ou minus méthodes.

LocalDate later = today.plus(thirtyDays); 

A propos de java.heure

Le cadre java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les classes date de temps anciens legacy gênants tels que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android

Le projet ThreeTen-Extra java.time étend avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver ici des classes utiles telles que Interval, YearWeek, YearQuarter et more.

Questions connexes