Jak uzyskać ostatnią datę danego miesiąca z JodaTime?

110

Muszę ustalić pierwszą datę (as org.joda.time.LocalDate) miesiąca i ostatnią. Zdobycie pierwszego jest trywialne, ale uzyskanie ostatniego wydaje się wymagać logiki, ponieważ miesiące mają różną długość, a długość lutego zmienia się nawet z upływem lat. Czy istnieje już mechanizm do tego wbudowany w JodaTime, czy powinienem zaimplementować go samodzielnie?

Ivan
źródło
2
Tylko DateTime
uwaga

Odpowiedzi:

222

Co powiesz na:

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

dayOfMonth()zwraca a, LocalDate.Propertyktóre reprezentuje pole „dzień miesiąca” w sposób, który zna źródło LocalDate.

Tak się składa, że withMaximumValue()metoda jest nawet udokumentowana, aby polecić ją do tego konkretnego zadania:

Ta operacja jest przydatna do uzyskiwania LocalDate ostatniego dnia miesiąca, ponieważ długość miesiąca jest różna.

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
Jon Skeet
źródło
1
@Jon Skeet Jak to osiągnąć za pomocą nowego interfejsu API daty i czasu w Javie 8?
Warren M. Nocos
5
@ WarrenM.Nocos: Używałbymdt.with(TemporalAdjusters.lastDayOfMonth())
Jon Skeet
4

Inna prosta metoda to:

//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
źródło
4
co się stanie, jeśli Twój miesiąc to = 12?
jon
JodaTime API to wyrafinowana, w pełni załadowana i wygodna praca. Istnieje wiele innych, bardziej poprawnych sposobów osiągnięcia tego celu.
aaiezza
Jeśli miesiąc to 12, wiesz, że ostatni dzień to 31, prawda? po prostu wpisz coś takiego: if (miesiąc <12) {answer = new DateTime (rok, miesiąc + 1,1,0,0,0); answer = answer.minusDays (1); } else odpowiedź = 31;
Abraham Maldonado Barrios
1

Stare pytanie, ale najlepszy wynik w Google, kiedy tego szukałem.

Jeśli ktoś potrzebuje intzamiast tego rzeczywistego ostatniego dnia jako JodaTime, możesz to zrobić:

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
źródło
1
Wolałbym nieco czystszą odpowiedź, na przykład: public static int getLastDayOfMonth (int rok, int miesiąc) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Ale twoja odpowiedź jest super pomocny, nawet jeśli jest trochę zaśmiecony, więc +1;)
skoki4fun
-1

Korzystając z JodaTime, możemy to zrobić:

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

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

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

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

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

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


    public static DateTime getLastDateOfMonth () {
        zwraca nową datę i godzinę (CURRENT_YEAR, CURRENT_MONTH,
                LAST_DAY_OF_CURRENT_MONTH, LAST_HOUR_OF_CURRENT_DAY,
                LAST_MINUTE_OF_CURRENT_HOUR, LAST_SECOND_OF_CURRENT_MINUTE);
    }

Jak opisuję tutaj, w moim małym streszczeniu na github: Klasa JodaTime i java.util.Date Util z wieloma przydatnymi funkcjami.

Dassi Orleando
źródło