Come ottenere l'ultima data di un determinato mese con JodaTime?


110

Devo ottenere il primo appuntamento (as org.joda.time.LocalDate) di un mese e l'ultimo. Ottenere il primo è banale, ma ottenere l'ultimo sembra aver bisogno di una logica poiché i mesi hanno una durata diversa e la durata di febbraio varia anche negli anni. Esiste un meccanismo per questo già integrato in JodaTime o dovrei implementarlo da solo?


2
Solo un DateTime
avvertimento

Risposte:


222

Che ne dite di:

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

dayOfMonth()restituisce un LocalDate.Propertyche rappresenta il campo "giorno del mese" in un modo che conosce l'origine LocalDate.

Come succede, il withMaximumValue()metodo è persino documentato per consigliarlo per questa particolare attività:

Questa operazione è utile per ottenere un LocalDate nell'ultimo giorno del mese, poiché la durata del mese varia.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();

1
@ Jon Skeet Come ottenerlo utilizzando la nuova API di data e ora di Java 8?
Warren M. Nocos

5
@ WarrenM.Nocos: io usereidt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet

4

Un altro metodo semplice è questo:

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

4
cosa succede se il tuo mese è = 12?
jon

L'API JodaTime è un lavoro sofisticato, completo e conveniente. Ci sono molti altri modi più corretti per farlo.
aaiezza

Se il mese è 12, sai che l'ultimo giorno è 31, giusto? metti qualcosa del genere: if (month <12) {answer = new DateTime (year, month + 1,1,0,0,0); answer = answer.minusDays (1); } altro answer = 31;
Abraham Maldonado Barrios

1

Una vecchia domanda, ma uno dei migliori risultati di Google quando stavo cercando questo.

Se qualcuno ha bisogno dell'ultimo giorno effettivo intinvece di usare JodaTime, puoi farlo:

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

1
Avrei preferito una risposta leggermente più pulita, come: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Ma la tua risposta è super utile, anche se leggermente ingombra, quindi +1;)
jumps4fun

-1

Usando JodaTime, possiamo farlo:

    pubblico statico finale Integer CURRENT_YEAR = DateTime.now (). getYear ();

    pubblico statico finale Integer CURRENT_MONTH = DateTime.now (). getMonthOfYear ();

    pubblico statico finale Intero LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            . .DayOfMonth () getMaximumValue ();

    pubblico statico finale Intero LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            . .HourOfDay () getMaximumValue ();

    pubblico statico finale Intero LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    pubblico statico finale Intero LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


    public static DateTime getLastDateOfMonth () {
        restituisci nuovo DateTime (CURRENT_YEAR, CURRENT_MONTH,
                LAST_DAY_OF_CURRENT_MONTH, LAST_HOUR_OF_CURRENT_DAY,
                LAST_MINUTE_OF_CURRENT_HOUR, LAST_SECOND_OF_CURRENT_MINUTE);
    }

Come descritto qui nella mia piccola sintesi su GitHub: Una classe JodaTime e java.util.Date Util con molte funzioni utili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.