web-dev-qa-db-fra.com

Comment obtenir le nombre de jours dans un mois donné avec Joda-Time?

30 days hath September,
   April, June and November,
 All the rest have 31,
   Excepting February alone
(And that has 28 days clear,
   With 29 in each leap year).

Puis-je obtenir ces informations de manière anagramme? (Je ne parle pas du poème, bien sûr)

55
Manuel Aráoz

Si vous avez un objet DateTime qui représente une valeur dans le mois, alors c'est assez simple. Vous obtenez la propriété dayOfMonth de cet objet DateTime et obtenez la valeur maximale de la propriété. Voici un exemple de fonction:

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}
98
Erick Robertson

Oui, bien que ce ne soit pas aussi joli qu'il pourrait l'être:

import org.joda.time.*;
import org.joda.time.chrono.*;
import org.joda.time.field.*;

public class Test {
    public static void main(String[] args) {
        GregorianChronology calendar = GregorianChronology.getInstance();
        DateTimeField field = calendar.dayOfMonth();

        for (int i = 1; i < 12; i++) {
            LocalDate date = new LocalDate(2010, i, 1, calendar);
            System.out.println(field.getMaximumValue(date));
        }
    }
}

Notez que j'ai codé en dur l'hypothèse qu'il y a 12 mois, et que nous sommes intéressés par 2010. J'ai explicitement cependant sélectionné la chronologie grégorienne - dans d'autres chronologies vous obtiendriez différentes réponses, bien sûr. (Et la boucle "12 mois" ne serait pas non plus une hypothèse valable ...)

J'ai choisi un LocalDate plutôt qu'un DateTime afin de récupérer la valeur, pour souligner (cependant légèrement :) que la valeur ne dépend pas du fuseau horaire.

Ce n'est toujours pas aussi simple qu'il y paraît, faites attention. Je ne sais pas ce qui se passe si vous utilisez une seule chronologie pour construire le LocalDate, mais demandez la valeur maximale d'un champ dans une autre chronologie. J'ai quelques idées sur ce que pourrait arriver, en sachant un certain temps sur Joda Time, mais ce n'est probablement pas une bonne idée :)

4
Jon Skeet
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
0
Benoit Courtine