Comment obtenir la dernière date d'un mois particulier avec JodaTime?

110

J'ai besoin d'obtenir la première date (as org.joda.time.LocalDate) d'un mois et la dernière. Obtenir le premier est trivial, mais obtenir le dernier semble nécessiter une certaine logique, car les mois ont une durée différente et la durée de février varie même au fil des années. Y a-t-il un mécanisme pour cela déjà intégré à JodaTime ou dois-je l'implémenter moi-même?

Ivan
la source
2
Juste un DateTime
avertissement

Réponses:

222

Que diriez-vous:

LocalDate endOfMonth = date.dayOfMonth().withMaximumValue();

dayOfMonth()renvoie un LocalDate.Propertyqui représente le champ «jour du mois» d'une manière qui connaît l'origine LocalDate.

En l'occurrence, la withMaximumValue()méthode est même documentée pour la recommander pour cette tâche particulière:

Cette opération est utile pour obtenir une LocalDate le dernier jour du mois, car la durée des mois varie.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
Jon Skeet
la source
1
@Jon Skeet Comment obtenir cela en utilisant la nouvelle API de date et d'heure de Java 8?
Warren M. Nocos
5
@ WarrenM.Nocos: J'utiliseraisdt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet
4

Une autre méthode simple est la suivante:

//Set the Date in First of the next Month:
answer = new DateTime(year,month+1,1,0,0,0);
//Now take away one day and now you have the last day in the month correctly
answer = answer.minusDays(1);
Abraham Maldonado Barrios
la source
4
que se passe-t-il alors si votre mois est = 12?
jon
L'API JodaTime est un travail sophistiqué, complet et pratique. Il existe de nombreuses autres manières plus correctes d'y parvenir.
aaiezza
Si le mois est 12, vous savez que le dernier jour est le 31, n'est-ce pas? il suffit de mettre quelque chose comme ceci: if (month <12) {answer = new DateTime (year, month + 1,1,0,0,0); answer = answer.minusDays (1); } sinon réponse = 31;
Abraham Maldonado Barrios
1

Une vieille question, mais un résultat top Google lorsque je cherchais cela.

Si quelqu'un a besoin du dernier jour pour intutiliser JodaTime à la place, vous pouvez le faire:

public static final int JANUARY = 1;

public static final int DECEMBER = 12;

public static final int FIRST_OF_THE_MONTH = 1;

public final int getLastDayOfMonth(final int month, final int year) {
    int lastDay = 0;

    if ((month >= JANUARY) && (month <= DECEMBER)) {
        LocalDate aDate = new LocalDate(year, month, FIRST_OF_THE_MONTH);

        lastDay = aDate.dayOfMonth().getMaximumValue();
    }

    return lastDay;
}
wiredniko
la source
1
J'aurais préféré une réponse un peu plus claire, comme: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Mais votre réponse est super utile, même si légèrement encombré, donc +1;)
jumps4fun
-1

En utilisant JodaTime, nous pouvons faire ceci:

    public static final Entier CURRENT_YEAR = DateTime.now (). getYear ();

    public static final Integer CURRENT_MONTH = DateTime.now (). getMonthOfYear ();

    public static final Entier LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            .dayOfMonth (). getMaximumValue ();

    public static final Entier LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            .hourOfDay (). getMaximumValue ();

    public static final Entier LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    public static final Entier LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


    public static DateTime getLastDateOfMonth () {
        renvoie un nouveau DateHeure (CURRENT_YEAR, CURRENT_MONTH,
                LAST_DAY_OF_CURRENT_MONTH, LAST_HOUR_OF_CURRENT_DAY,
                LAST_MINUTE_OF_CURRENT_HOUR, LAST_SECOND_OF_CURRENT_MINUTE);
    }

Comme décrit ici dans mon petit résumé sur github: Une classe Util JodaTime et java.util.Date avec beaucoup de fonctions utiles.

Dassi Orleando
la source