¿Cómo obtener la última fecha de un mes en particular con JodaTime?

110

Necesito obtener la primera fecha (como org.joda.time.LocalDate) de un mes y la última. Obtener el primero es trivial, pero obtener el último parece necesitar algo de lógica, ya que los meses tienen una duración diferente y la duración de febrero incluso varía con los años. ¿Hay un mecanismo para esto ya integrado en JodaTime o debería implementarlo yo mismo?

Iván
fuente
2
Solo un DateTime
aviso

Respuestas:

222

Qué tal si:

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

dayOfMonth()devuelve un LocalDate.Propertyque representa el campo "día del mes" de una manera que conoce el origen LocalDate.

Da la casualidad que el withMaximumValue()método incluso está documentado para recomendarlo para esta tarea en particular:

Esta operación es útil para obtener un LocalDate el último día del mes, ya que la duración de los meses varía.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
Jon Skeet
fuente
1
@Jon Skeet ¿Cómo obtener esto usando la nueva API de fecha y hora de Java 8?
Warren M. Nocos
5
@ WarrenM.Nocos: Yo usaríadt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet
4

Otro método simple es 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
fuente
4
¿Qué pasa entonces si tu mes es = 12?
jon
La API de JodaTime es un trabajo sofisticado, completamente cargado y conveniente. Hay muchas otras formas más correctas de lograr esto.
aaiezza
Si el mes es 12, sabes que el último día es 31, ¿verdad? simplemente ponga algo como esto: if (mes <12) {respuesta = new DateTime (año, mes + 1,1,0,0,0); answer = answer.minusDays (1); } más respuesta = 31;
Abraham Maldonado Barrios
1

Una vieja pregunta, pero un resultado superior en Google cuando estaba buscando esto.

Si alguien necesita el último día real como un intuso de JodaTime, puede hacer esto:

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
fuente
1
Hubiera preferido una respuesta un poco más limpia, como: public static int getLastDayOfMonth (int year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Pero tu respuesta es muy útil, incluso si está un poco desordenado, así que +1;)
jumps4fun
-1

Usando JodaTime, podemos hacer esto:

    Entero final estático público CURRENT_YEAR = DateTime.now (). getYear ();

    Entero final estático público CURRENT_MONTH = DateTime.now (). getMonthOfYear ();

    Entero final estático público LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            .dayOfMonth (). getMaximumValue ();

    Entero final estático público LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            .hourOfDay (). getMaximumValue ();

    Entero final estático público LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    Entero final estático público LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


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

Como se describe aquí en mi pequeña esencia sobre github: una clase de JodaTime y java.util.Date Util con muchas funciones útiles.

Dassi Orleando
fuente