Como obter a última data de um determinado mês com JodaTime?

110

Preciso obter a primeira data (as org.joda.time.LocalDate) de um mês e a última. Obter o primeiro é trivial, mas obter o último parece exigir alguma lógica, pois os meses têm durações diferentes e a duração de fevereiro varia até mesmo ao longo dos anos. Existe um mecanismo para isso já incorporado ao JodaTime ou devo implementá-lo sozinho?

Ivan
fonte
2
Apenas um DateTime
aviso

Respostas:

222

E se:

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

dayOfMonth()retorna um LocalDate.Propertyque representa o campo "dia do mês" de uma forma que conhece a origem LocalDate.

Acontece que o withMaximumValue()método está até mesmo documentado para recomendá-lo para esta tarefa específica:

Esta operação é útil para obter uma LocalDate no último dia do mês, pois a duração do mês varia.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
Jon Skeet
fonte
1
@Jon Skeet Como fazer isso usando a nova API de data e hora do Java 8?
Warren M. Nocos
5
@ WarrenM.Nocos: Eu usariadt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet
4

Outro método simples é este:

//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
fonte
4
o que acontece então se o seu mês for = 12?
jon
A API JodaTime é uma peça de trabalho sofisticada, totalmente carregada e conveniente. Existem muitas outras maneiras mais corretas de fazer isso.
aaiezza
Se o mês for 12, você sabe que o último dia é 31, certo? basta colocar algo assim: if (mês <12) {answer = new DateTime (ano, mês + 1,1,0,0,0); answer = answer.minusDays (1); } outra resposta = 31;
Abraham Maldonado Barrios
1

Uma pergunta antiga, mas um dos principais resultados do Google quando eu estava procurando por isso.

Se alguém precisa do último dia real como um em intvez de usar o JodaTime, você pode fazer o seguinte:

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
fonte
1
Eu teria preferido uma resposta um pouco mais clara, como: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Mas sua resposta é muito útil, mesmo se um pouco confuso, então +1;)
jumps4fun
-1

Usando JodaTime, podemos fazer isso:

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

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

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

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

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

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


    public static DateTime getLastDateOfMonth () {
        retornar novo 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);
    }

Conforme descrevo aqui em minha pequena essência no github: A JodaTime e java.util.Date Util Class com várias funções úteis.

Dassi Orleando
fonte