Как получить последнюю дату определенного месяца с JodaTime?


110

Мне нужно получить первое число (а org.joda.time.LocalDate) месяца и последнее. Получить первое тривиально, но получение последнего, похоже, требует некоторой логики, поскольку месяцы имеют разную длину, а продолжительность февраля даже меняется с годами. Есть ли механизм для этого, уже встроенный в JodaTime, или я должен реализовать его самостоятельно?


2
Просто хедз-ап, это также работает с DateTimeтипами :)
vikingsteve

Ответы:


222

Как насчет:

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

dayOfMonth()возвращает, LocalDate.Propertyкоторый представляет поле «день месяца» способом, который знает источник LocalDate.

Как оказалось, withMaximumValue()метод даже задокументирован, чтобы рекомендовать его для этой конкретной задачи:

Эта операция полезна для получения LocalDate в последний день месяца, поскольку длина месяца может быть разной.

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

1
@Jon Skeet Как этого добиться с помощью нового API даты и времени Java 8?
Уоррен М. Нокос

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?
jon

JodaTime API - это сложная, полностью загруженная и удобная часть работы. Есть много других, более правильных способов добиться этого.
aaiezza

Если в месяце 12, вы знаете, что последний день 31, верно? просто введите что-то вроде этого: if (month <12) {answer = new DateTime (year, month + 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 year, int month) {LocalDate date = new LocalDate (year, month, 1 return date.dayOfMonth (). GetMaximumValue ();} Но ваш ответ очень полезно, даже если немного загромождено, так что +1;)
jumps4fun

-1

Используя JodaTime, мы можем сделать это:

    общедоступное статическое конечное целое число CURRENT_YEAR = DateTime.now (). getYear ();

    общедоступное статическое конечное целое число CURRENT_MONTH = DateTime.now (). getMonthOfYear ();

    общедоступное статическое конечное целое число LAST_DAY_OF_CURRENT_MONTH = DateTime.now ()
            .dayOfMonth (). getMaximumValue ();

    общедоступное статическое конечное целое число LAST_HOUR_OF_CURRENT_DAY = DateTime.now ()
            .hourOfDay (). getMaximumValue ();

    общедоступное статическое конечное целое число LAST_MINUTE_OF_CURRENT_HOUR = DateTime.now (). minuteOfHour (). getMaximumValue ();

    общедоступное статическое конечное целое число LAST_SECOND_OF_CURRENT_MINUTE = DateTime.now (). secondOfMinute (). getMaximumValue ();


    public static 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: Util Class JodaTime и java.util.Date с множеством полезных функций.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.