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

89

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

  • 1
    Просто один на один, это также работает с типами DateTime :)
Теги:
jodatime

4 ответа

178
Лучший ответ

Как насчет:

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

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

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

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

LocalDate lastDayOfMonth = dt.dayOfMonth().withMaximumValue();
  • 0
    @Jon Skeet Как получить это, используя новый API даты и времени Java 8?
  • 4
    @ WarrenM.Nocos: я бы использовал dt.with(TemporalAdjusters.lastDayOfMonth())
5

Еще один простой способ:

//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);
  • 2
    что произойдет, если ваш месяц = 12?
  • 0
    JodaTime API - это сложная, полностью загруженная и удобная часть работы. Есть много других, более правильных способов сделать это.
Показать ещё 1 комментарий
0

Старый вопрос, но лучший результат 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;)
-2

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


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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню