我正在尝试实现一种返回以下内容的方法:
我能够找出从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
我的问题是如何返回当前/上一个季度和年份的开始和结束日期。例如,假设今天的日期是10/19/2018 将返回以下内容:
答案 0 :(得分:0)
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);
从3月1日开始的一年和2018年10月19日的当前日期,上述代码段输出:
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
类。它有几个设计问题,并且已经过时了。相反,我使用来自Java.time(现代Java日期和时间API)的LocalDate
。与Calendar
相反,LocalDate
表示没有日期和时区的日期,因此这是我们在这里需要的。
由于时间间隔通常是半开放的-从开始包括开始到结束不包括在内-我在结束日期变量的名称中添加了Inclusive
,以明确我们在此处使用的是封闭时间间隔。
链接: Oracle tutorial: Date Time解释了如何使用java.time
。