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

Я пытаюсь реализовать способ вернуть следующее:

  • дата текущего квартала
  • дата предыдущего квартала
  • текущий год
  • предыдущий год

Мне удалось выяснить, как это сделать для типичного года, начинающегося 01.01, с помощью следующего:

      //Current quarter start and end date
      aCalendar.setTime(this.startdate);
    aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3);
    aCalendar.set(Calendar.DAY_OF_MONTH, 1);
    this.quarterStartDate = aCalendar.getTime();

    aCalendar.setTime(this.startdate);
    aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3 + 2);
    aCalendar.set(Calendar.DAY_OF_MONTH, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    this.quarterEndDate = aCalendar.getTime();
    if (this.quarterEndDate.getTime() > currentCalendar.getTimeInMillis())
        this.quarterEndDate = currentCalendar.getTime();

    // previous quarter
    aCalendar.setTime(this.startdate);
    aCalendar.add(Calendar.MONTH, -3);
    aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3 + 2);
    aCalendar.set(Calendar.DAY_OF_MONTH, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
    this.previousQuarterEndDate = aCalendar.getTime();

    aCalendar.setTime(this.startdate);
    aCalendar.add(Calendar.MONTH, -3);
    aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3);
    aCalendar.set(Calendar.DAY_OF_MONTH, 1);
    this.previousQuarterStartDate = aCalendar.getTime();

    // current year
    aCalendar.setTime(this.startdate);
    aCalendar.set(Calendar.MONTH, 11); 
    aCalendar.set(Calendar.DAY_OF_MONTH, 31); 
    this.currentYearEndDate = aCalendar.getTime();

    if (this.currentYearEndDate.getTime() > currentCalendar.getTimeInMillis())
        this.currentYearEndDate = currentCalendar.getTime();

    aCalendar.setTime(this.startdate);
    aCalendar.set(Calendar.MONTH, 0); 
    aCalendar.set(Calendar.DAY_OF_MONTH, 1); 
    this.currentYearStartDate = aCalendar.getTime();

    // previous year
    aCalendar.setTime(this.currentYearEndDate);
    aCalendar.set(Calendar.YEAR, aCalendar.get(Calendar.YEAR) - 1);
    aCalendar.set(Calendar.MONTH, 11); // 
    aCalendar.set(Calendar.DAY_OF_MONTH, 31); 
    this.previousYearEndDate = aCalendar.getTime();

    aCalendar.setTime(this.currentYearStartDate);
    aCalendar.set(Calendar.YEAR, aCalendar.get(Calendar.YEAR) - 1);
    aCalendar.set(Calendar.MONTH, 0); // 
    aCalendar.set(Calendar.DAY_OF_MONTH, 1); 
    this.previousYearStartDate = aCalendar.getTime();

Однако, что я пытаюсьРешить, если год начинается в другой день, например, 3/01/2018, чем квартал будет

**Q1** = 03/01/2018 -05/31/2018
**Q2** = 06/01/2018- 08/30/2018
**Q3** = 09/01/2018 - 11/30/2018
**Q4** = 12/01/2018 - 02/28/2019

МОЙ ВОПРОС как я могу вернутьсятекущий / предыдущий квартал и год, даты начала и окончания.Например, предположим, что сегодняшняя дата - 19.10.2017, тогда должно быть возвращено следующее:

  • текущий квартал: Start_Date = 9/1/2018 End_Date = 19/19/2018
  • предыдущий квартал: Start_Date = 01.06.2017 End_Date = 30/30/2018
  • Текущий год: Start_Date = 01.03.2017 End_Date = 10/19/2018
  • предыдущий год:Start_Date = 3/12017 End_Date = 2/28/2018

1 Ответ

0 голосов
/ 07 февраля 2019

java.time

    final Month yearStart = Month.MARCH;
    final int yearStartValue = yearStart.getValue();

    LocalDate currentDate = LocalDate.of(2018, Month.OCTOBER, 19);

    // Current quarter start and end date
    // First find 0-based month witin quarter; 0, 1 or 2 
    int monthInQuarter = (currentDate.getMonthValue() + 12 - yearStartValue) % 3;
    LocalDate currentQuarterStart
            = currentDate.withDayOfMonth(1).minusMonths(monthInQuarter);
    LocalDate currentQuarterEndInclusive
            = currentQuarterStart.plusMonths(3).minusDays(1);
    System.out.println("Current quarter:  " + currentQuarterStart
            + " through " + currentQuarterEndInclusive);

    // previous quarter
    LocalDate previousQuarterStart = currentQuarterStart.minusMonths(3);
    LocalDate previousQuarterEndInclusive = currentQuarterStart.minusDays(1);
    System.out.println("Previous quarter: " + previousQuarterStart
            + " through " + previousQuarterEndInclusive);

    // current year
    // Find 0-based month in year
    int monthInYear = (currentDate.getMonthValue() + 12 - yearStartValue) % 12;
    LocalDate currentYearStart
            = currentDate.withDayOfMonth(1).minusMonths(monthInYear);
    LocalDate currentYearEndInclusive
            = currentYearStart.plusYears(1).minusDays(1);
    System.out.println("Current year:     " + currentYearStart
            + " through " + currentYearEndInclusive);

    // previous year
    LocalDate previousYearStart = currentYearStart.minusYears(1);
    LocalDate previousYearEndInclusive = currentYearStart.minusDays(1);
    System.out.println("Previous year:    " + previousYearStart
            + " through " + previousYearEndInclusive);

Если год начинается с 1 марта, а текущая дата - 19 октября 2018 года, приведенный выше фрагмент кода выводит:

Current quarter:  2018-09-01 through 2018-11-30
Previous quarter: 2018-06-01 through 2018-08-31
Current year:     2018-03-01 through 2019-02-28
Previous year:    2017-03-01 through 2018-02-28

Вы не должны использовать класс Calendar.Он имеет несколько проблем с дизайном и давно устарел.Вместо этого я использую LocalDate из java.time, современного API даты и времени Java.В отличие от Calendar a LocalDate представляет собой дату без времени суток и без часового пояса, поэтому нам нужно именно это.

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

Ссылка: Учебное пособие по Oracle: Дата и время объясняя, как использовать java.time.

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