Як отримати останню дату конкретного місяця за допомогою JodaTime?


110

Мені потрібно отримати перше побачення org.joda.time.LocalDateмісяця та останнє. Отримання першого є тривіальним, але для отримання останнього, мабуть, потрібна певна логіка, оскільки місяці мають різну тривалість, а тривалість лютого навіть змінюється протягом років. Чи є механізм для цього вже вбудований в JodaTime або я повинен сам його реалізувати?


2
Просто голова, це також працює з DateTimeтипами :)
vikingsteve

Відповіді:


222

Як щодо:

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

dayOfMonth()повертає a, LocalDate.Propertyщо представляє поле "день місяця" таким чином, що знає початок LocalDate.

Як це буває, withMaximumValue()метод навіть задокументований, щоб рекомендувати його для цієї конкретної задачі:

Ця операція корисна для отримання LocalDate в останній день місяця, оскільки тривалість місяця змінюється.

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

1
@Jon Skeet Як отримати це за допомогою нового інтерфейсу API дати та часу Java 8?
Warren M. Nocos

5
@ WarrenM.Nocos: Я б використавdt.with(TemporalAdjusters.lastDayOfMonth())
Джон Скіт

4

Ще один простий метод такий:

//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
що станеться, якщо ваш місяць = 12?
Джон

API JodaTime - це витончена, повністю завантажена та зручна робота. Існує багато інших, більш правильних способів цього досягти.
aaiezza

Якщо місяць - 12, ви знаєте, останній день - 31 правда? просто поставте щось подібне: if (місяць <12) {answer = new DateTime (рік, місяць + 1,1,0,0,0); answer = answer.minusDays (1); } else answer = 31;
Авраам Мальдонадо Барріос

1

Старе запитання, але найкращий результат google, коли я шукав це.

Якщо комусь потрібен фактичний останній день intзамість цього, використовуючи JodaTime, ви можете зробити це:

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
Я б віддав перевагу трохи чіткішій відповіді, як-от: public static int getLastDayOfMonth (int рік, int місяць) {LocalDate date = new LocalDate (рік, місяць, 1 дата повернення.dayOfMonth (). GetMaximumValue ();} Але ваша відповідь Супер корисно, навіть якщо трохи захаращено, тому +1;)
стрибки4фун

-1

Використовуючи JodaTime, ми можемо це зробити:

    загальнодоступний статичний кінцевий Integer CURRENT_YEAR = DateTime.now (). getYear ();

    загальнодоступний статичний кінцевий Integer CURRENT_MONTH = DateTime.now (). getMonthOfYear ();

    загальнодоступний статичний кінцевий цілий число LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            .dayOfMonth (). getMaximumValue ();

    загальнодоступний статичний кінцевий цілий число LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            .hourOfDay (). getMaximumValue ();

    загальнодоступний статичний кінцевий Integer LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    загальнодоступний статичний кінцевий Integer LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


    загальнодоступний статичний DateTime getLastDateOfMonth () {
        повернути новий 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);
    }

Як описано тут у моїй невеликій суті про github: A JodaTime та java.util.Date Util Class з безліччю корисних функцій.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.