Как получить последние три месяца первую дату и последнюю дату на основе текущей даты, включая текущую дату в Java? - PullRequest
0 голосов
/ 26 апреля 2019

Я хочу классифицировать значения на основе месяцев, чтобы отфильтровать эти значения, требуемые 1-я и последняя дата последних трех месяцев, на основе текущего месяца, включая значения текущего месяца.Вот сколько последних месяцев является показателем.Я хотел список всех месяцев 1-го числа и последнего числа.Любая логика для того же будет полезна.

например: -

     //     parameters 
          int lastMonths = 3;
          date currentDate= 26-04-2019;

 //expected output
 current month is 04-2019 ,1st date is 1-04-2019 and last date is 30-04-2019 
 previous month is 03-2019, 1st date is 01-03-2019 and last date is 31-03-2019
 previous month is 02-2019, 1st date is 01-02-2019 and last date is 28-02-2019

Ответы [ 6 ]

1 голос
/ 26 апреля 2019

Используйте java.util.Calendar для сложения и вычитания в дате

и

java.text.DateFormat для форматирования даты

    DateFormat format = new SimpleDateFormat("dd-MM-yyyy", Locale.US);
    DateFormat monthFormat = new SimpleDateFormat("MM-yyyy", Locale.US);
    Calendar cal = Calendar.getInstance();
    cal.setTime(format.parse("26-04-2019"));
    for (int i = 0; i < 3; i++){
        System.out.println("currentDate: " + monthFormat.format(cal.getTime())); // print current month

        cal.set(Calendar.DAY_OF_MONTH, 1);
        System.out.println("first date: " + format.format(cal.getTime())); // print first date

        cal.add(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        cal.add(Calendar.DATE, -1);

        System.out.println("last date: " + format.format(cal.getTime())); // print last date


        cal.add(Calendar.MONTH, -1);
    }
1 голос
/ 26 апреля 2019

Важно сказать - есть тонны библиотек, которые дадут вам эту конкретную потребность, но я бы хотел положиться на ту, которая выполняет свою работу и фактически была разработана для (некоторых из вас ...) этих вариантов использования - Библиотека Java.time.LocalDate (уже встроена в Java 8)

import java.time.LocalDate;

LocalDate now = LocalDate.now(); // 2019-04-26

Чтобы получить первые и последние дни месяца, вы можете использовать:

LocalDate start = YearMonth.now().atDay(1);

(сейчас может быть другой месяц, конечно)

LocalDate end = YearMonth.now().atEndOfMonth();

Вы можете использовать его специально в течение одного / двух месяцев или с некоторыми для цикла. Примеры ниже:
1. Конкретный звонок:

LocalDate earlierOneMonth = now.minusMonths(1); // 2019-03-26
earlierOneMonth.getDay(); // 26

2. Для цикла: (поэтому вам нужно что-то вроде массива / списка для хранения этих значений ...)

for(int i=0; i < lastMonths - 1; i++){
   arr(i) = now.minusMonths(i + 1);

}

Также для получения названия месяца вы можете использовать ->

earlierOneMonth.getMonth(); // APRIL
earlierOneMonth.getMonth.getValue(); // 04

Наконец, чтобы получить год, вы можете использовать ->

earlier.getYear(); // 2019

Когда у вас есть все желаемые значения, вы можете распечатать их по вашему запросу с ожидаемым результатом:

 "current month is" + nowMonth + "-" + nowYear + " ,1st date is" +  nowDay + "-" + nowMonth + "-" + nowYear + " and last date is ...

Дайте мне знать, если это достаточно ясно:)

0 голосов
/ 26 апреля 2019

ТЛ; др

YearMonth.now().minusMonths( 3 ).atDay( 1 )      // Get the first day of the month of three months ago. Returns `LocalDate` object.
YearMonth.now().minusMonths( 3 ).atEndOfMonth()  // Get the last day of the month of three months ago. Returns `LocalDate` object.

YearMonth

Вы действительно заботитесь о месяцах. Даты второстепенны. Так что сосредоточьтесь на месяцах. У Java есть класс для этого!

Класс YearMonth представляет конкретный месяц определенного года.

ZoneId z = ZoneId.of( "America/Edmonton" ) ;
YearMonth currentYm = YearMonth.now( z ) ;

Соберите интересующие вас месяцы.

List< YearMonth > yms = new ArrayList<>() ;
int limit = 3 ; // We want current month plus three previous months. 
for( int i = 0 ; i <= limit ; i ++ ) {
    YearMonth ym = currentYm.minusMonths( i ) ;
    yms.add( ym ) ;
}

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

for( YearMonth ym : yms ) {
    System.out.println( "YearMonth: " + ym + " starts: " + ym.atDay( 1 ) +  " ends: " + ym.atEndOfMonth() ) ; 
}

См. код, запущенный в режиме реального времени на IdeOne.com .

ГодМесяц: 2019-04 Начало: 2019-04-01 Окончание: 2019-04-30

ГодМесяц: 2019-03 Начало: 2019-03-01 Окончание: 2019-03-31

ГодМесяц: 2019-02 Начало: 2019-02-01 Окончание: 2019-02-28

ГодМесяц: 2019-01 Начало: 2019-01-01 Окончание: 2019-01-31

0 голосов
/ 26 апреля 2019
    LocalDate currentDate = LocalDate.of(2019, 4, 26);//current date
    System.out.println(currentDate);
    int lastMonths = 3;//number of months
    LocalDate prevDate = null;
    LocalDate start = null;
    LocalDate end = null;

    for(int i = 0; i < lastMonths; i++) {
        if(prevDate == null) {
            start = currentDate.withDayOfMonth(1);//First day of current month
            end = currentDate.withDayOfMonth(currentDate.lengthOfMonth());//Last day of current month
            prevDate = currentDate.minusMonths(1);//subtracting one month from current month 
        } else {
            start = prevDate.withDayOfMonth(1);//First day of previous month
            end = prevDate.withDayOfMonth(prevDate.lengthOfMonth());//Last day of previous month
            prevDate = prevDate.minusMonths(1);//subtracting one month from previous month
        }
        System.out.println(start + " " + end);
    }

Вывод:

2019-04-26
2019-04-01 2019-04-30
2019-03-01 2019-03-31
2019-02-01 2019-02-28

Ссылка: Получить первый и последний день месяца с помощью threeten, LocalDate

0 голосов
/ 26 апреля 2019
    int lastMonths = 3;

    Calendar calendar = Calendar.getInstance();

    int year = calendar.get(Calendar.YEAR);
    int month = calendar.get(Calendar.MONTH) + 1;
    int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

    DateFormat monthYearFormat = new SimpleDateFormat("MM-yyyy");

    for (int i = 0; i < lastMonths; i++) {

        int monthOfYear = month - i;

        // if month is january, reset couter and month
        if(monthOfYear == 0) {
            month = 13;
            year -= 1;
            i = 0;
            continue;
        }

        // get last day of month (month length)
        YearMonth yearMonth = YearMonth.of(year, monthOfYear);
        int firstDay = 1;
        int lastDay  = yearMonth.lengthOfMonth();

        // create date with given year, month and day
        Date date = new GregorianCalendar(year, monthOfYear - 1, firstDay).getTime();

        String monthAndYear = monthYearFormat.format(date);

        String currentOrPrevious;

        if (i == 0) {
            currentOrPrevious = "current";
        } else {
            currentOrPrevious = "previous";
        }

        String output = String.format("%s month is %s, 1st date is %02d-%s and last date is %d-%s", currentOrPrevious, monthAndYear, firstDay, monthAndYear, lastDay, monthAndYear);

        System.out.println(output);
    }

Выход:

current month is 04-2019, 1st date is 01-04-2019 and last date is 30-04-2019
previous month is 03-2019, 1st date is 01-03-2019 and last date is 31-03-2019
previous month is 02-2019, 1st date is 01-02-2019 and last date is 28-02-2019
0 голосов
/ 26 апреля 2019

Если вам нужен объект Date, то все будет в порядке

        Date date = getDate(targetDate);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, -3);
        calendar.set(Calendar.DAY_OF_MONTH, 1);

        // calendar.getTime()
        // The line above returns Date object

Если вам нужна простая строка, вы можете отформатировать ее любым способом, просто используя DateTimeFormatter из библиотеки org.joda.time и просто используя его метод print () в calendar.getTimeInMillis ().

...