在java中,如何获取从01/01开始的日期不同于01/01的年份的上一个/当前季度和年份的开始和结束日期

pprl5pva  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(422)

我正在尝试实现一种返回以下内容的方法:
当前季度日期
上一季度日期
本年
上年
从2001年1月1日开始,我就可以用以下方法计算出一个典型的年份:

  1. //Current quarter start and end date
  2. aCalendar.setTime(this.startdate);
  3. aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3);
  4. aCalendar.set(Calendar.DAY_OF_MONTH, 1);
  5. this.quarterStartDate = aCalendar.getTime();
  6. aCalendar.setTime(this.startdate);
  7. aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3 + 2);
  8. aCalendar.set(Calendar.DAY_OF_MONTH, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
  9. this.quarterEndDate = aCalendar.getTime();
  10. if (this.quarterEndDate.getTime() > currentCalendar.getTimeInMillis())
  11. this.quarterEndDate = currentCalendar.getTime();
  12. // previous quarter
  13. aCalendar.setTime(this.startdate);
  14. aCalendar.add(Calendar.MONTH, -3);
  15. aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3 + 2);
  16. aCalendar.set(Calendar.DAY_OF_MONTH, aCalendar.getActualMaximum(Calendar.DAY_OF_MONTH));
  17. this.previousQuarterEndDate = aCalendar.getTime();
  18. aCalendar.setTime(this.startdate);
  19. aCalendar.add(Calendar.MONTH, -3);
  20. aCalendar.set(Calendar.MONTH, aCalendar.get(Calendar.MONTH) / 3 * 3);
  21. aCalendar.set(Calendar.DAY_OF_MONTH, 1);
  22. this.previousQuarterStartDate = aCalendar.getTime();
  23. // current year
  24. aCalendar.setTime(this.startdate);
  25. aCalendar.set(Calendar.MONTH, 11);
  26. aCalendar.set(Calendar.DAY_OF_MONTH, 31);
  27. this.currentYearEndDate = aCalendar.getTime();
  28. if (this.currentYearEndDate.getTime() > currentCalendar.getTimeInMillis())
  29. this.currentYearEndDate = currentCalendar.getTime();
  30. aCalendar.setTime(this.startdate);
  31. aCalendar.set(Calendar.MONTH, 0);
  32. aCalendar.set(Calendar.DAY_OF_MONTH, 1);
  33. this.currentYearStartDate = aCalendar.getTime();
  34. // previous year
  35. aCalendar.setTime(this.currentYearEndDate);
  36. aCalendar.set(Calendar.YEAR, aCalendar.get(Calendar.YEAR) - 1);
  37. aCalendar.set(Calendar.MONTH, 11); //
  38. aCalendar.set(Calendar.DAY_OF_MONTH, 31);
  39. this.previousYearEndDate = aCalendar.getTime();
  40. aCalendar.setTime(this.currentYearStartDate);
  41. aCalendar.set(Calendar.YEAR, aCalendar.get(Calendar.YEAR) - 1);
  42. aCalendar.set(Calendar.MONTH, 0); //
  43. aCalendar.set(Calendar.DAY_OF_MONTH, 1);
  44. this.previousYearStartDate = aCalendar.getTime();

然而,我想解决的是,如果一年的开始日期与季度不同,例如2018年1月3日

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

我的问题是如何返回当前/上一季度和年度的开始和结束日期。例如,假设今天的日期是2018年10月19日,则应返回以下内容:
本季度:开始日期=2018年9月1日结束日期=2018年10月19日
上一季度:开始日期=6/1/2018结束日期=8/30/2018
本年度:开始日期=2018年3月1日结束日期=2018年10月19日
上一个year:start_date =3/12017结束日期=2/28/2018

cwtwac6a

cwtwac6a1#

java.time文件

  1. final Month yearStart = Month.MARCH;
  2. final int yearStartValue = yearStart.getValue();
  3. LocalDate currentDate = LocalDate.of(2018, Month.OCTOBER, 19);
  4. // Current quarter start and end date
  5. // First find 0-based month witin quarter; 0, 1 or 2
  6. int monthInQuarter = (currentDate.getMonthValue() + 12 - yearStartValue) % 3;
  7. LocalDate currentQuarterStart
  8. = currentDate.withDayOfMonth(1).minusMonths(monthInQuarter);
  9. LocalDate currentQuarterEndInclusive
  10. = currentQuarterStart.plusMonths(3).minusDays(1);
  11. System.out.println("Current quarter: " + currentQuarterStart
  12. + " through " + currentQuarterEndInclusive);
  13. // previous quarter
  14. LocalDate previousQuarterStart = currentQuarterStart.minusMonths(3);
  15. LocalDate previousQuarterEndInclusive = currentQuarterStart.minusDays(1);
  16. System.out.println("Previous quarter: " + previousQuarterStart
  17. + " through " + previousQuarterEndInclusive);
  18. // current year
  19. // Find 0-based month in year
  20. int monthInYear = (currentDate.getMonthValue() + 12 - yearStartValue) % 12;
  21. LocalDate currentYearStart
  22. = currentDate.withDayOfMonth(1).minusMonths(monthInYear);
  23. LocalDate currentYearEndInclusive
  24. = currentYearStart.plusYears(1).minusDays(1);
  25. System.out.println("Current year: " + currentYearStart
  26. + " through " + currentYearEndInclusive);
  27. // previous year
  28. LocalDate previousYearStart = currentYearStart.minusYears(1);
  29. LocalDate previousYearEndInclusive = currentYearStart.minusDays(1);
  30. System.out.println("Previous year: " + previousYearStart
  31. + " through " + previousYearEndInclusive);

从3月1日开始的一年,当前日期为2018年10月19日,以上代码片段输出:

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

你不应该想用 Calendar 班级。它有几个设计问题,已经过时很久了。我用的是 LocalDate 来自java.time,现代java日期和时间api。与a相反 CalendarLocalDate 表示一个没有时间和时区的日期,所以我们需要它。
由于时间间隔通常是半开放的-从开始包含到结束独占-我补充说 Inclusive 结束日期变量的名称,以明确我们在这里使用的是闭合间隔。
link:oracle tutorial:说明如何使用的日期和时间 java.time .

展开查看全部

相关问题