последняя дата предыдущего месяца с 30 днями мая - PullRequest
1 голос
/ 24 июня 2019

Я использую приведенный ниже код для получения последнего дня в предыдущем месяце - например, май.Но он возвращает 30 дней вместо 31.

Код, приведенный ниже

package net.vcmg.date;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang.time.DateUtils;

public class LastDayPreviousMonth {
    public static void main(String[] args) {
        Date lastDateOfPreviousMonth = addMonths(lastDayOfTheMonth(today()), -1);
        System.out.println("lastDateOfPreviousMonth: "+lastDateOfPreviousMonth);

    }

    //the below method is from Utils.java
    public static Date lastDayOfTheMonth(Date d) {
           Calendar cal = Calendar.getInstance();
           cal.setTime(d);
           int actualMax = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
           cal.set(Calendar.DAY_OF_MONTH, actualMax);
           return cal.getTime();
    }

    public static Date addMonths(Date date, int numMonths)
    {
        return DateUtils.addMonths(date, numMonths);
    }

    public static Date today()
    {
        return truncDate(now());
    }

    public static Date now()
    {
        // will cut-off milliseconds
        return new Date( (System.currentTimeMillis()/1000) * 1000);
    }

    public static Date truncDate (Date date) {
        return DateUtils.truncate(date, Calendar.DATE);
    }

}

Здесь, когда я вызываю lastDateOfPreviousMonth в основном методе, он возвращает только 30 дней.Не 31 мая содержит 31 день на самом деле.Пожалуйста, помогите.

Ответы [ 3 ]

6 голосов
/ 24 июня 2019

Java 8

Если вы не ограничены в использовании старого Date, будет лучше использовать новый java.time.LocalDate

LocalDate previousMonth = LocalDate.now().minusMonths(1);

LocalDate start = previousMonth.withDayOfMonth(1);
LocalDate end = previousMonth.withDayOfMonth(previousMonth.lengthOfMonth());
System.out.println(start);
System.out.println(end);

Output

2019-05-01
2019-05-31

Редактировать

Для вашей реализации измените порядок методов

  1. addMonths - получите текущую дату и предоставьте предыдущуюмесяц addMonths(new Date(), -1)
  2. lastDayOfTheMonth - получить последний день предыдущего месяца lastDayOfTheMonth(addMonths(new Date(), -1))
Date lastDateOfPreviousMonth = lastDayOfTheMonth(addMonths(new Date(), -1));

Выходные данные

lastDateOfPreviousMonth: Fri May 31 10:46:13 EEST 2019
1 голос
/ 24 июня 2019

Попробуйте:

public static void main(String[] args) {
        Date lastDateOfPreviousMonth = lastDayOfTheMonth(addMonths(today(), -1));
        System.out.println("lastDateOfPreviousMonth: " + lastDateOfPreviousMonth);

    }

При вызове lastDayOfTheMonth для today () день будет 30. И после минус одного месяца ожидаемый результат будет 30, а не 31.

0 голосов
/ 24 июня 2019

Это логическая ошибка в том, как вы продумали свою программу / алгоритм. Сначала вы находите последний день месяца, в данном случае 30 июня. Затем вычитаете 1 месяц. Это дает 30 мая независимо от того, что в мае 31 день (из документации DateUtils.addMonths не ясно, что он работает таким образом, но он использует плохо спроектированный и устаревший класс Calendar внутри, так что это то, что мы должны ожидать).

Вместо этого делайте вещи в обратном порядке. Сначала найдите предыдущий месяц:

YearMonth lastMonth = YearMonth.now(ZoneId.of("Asia/Kolkata")).minusMonths(1);

2019-05

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

Только тогда найдите последний день месяца:

LocalDate lastDayOfLastMonth = lastMonth.atEndOfMonth();

2019-05-31

Избегайте даты и календаря

Я рекомендую не использовать Date и Calendar. Эти классы плохо разработаны и давно устарели. Вместо этого используйте LocalDate и другие классы из java.time, современного Java-API даты и времени. Это также избавит вас от внешней зависимости от Apache DateUtils, поскольку его функциональные возможности обычно встроены в современные классы.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...