[英]How to get the first date and last date of current quarter in java.util.Date when fiscal year starts from August
[英]How to get previous/ current quarter and year start and end dates for a year that starts on a date different from 01/01 in Java
我正在嘗試實現一種方法來返回以下內容:
我能夠找出從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();
但是,我要解決的問題是,例如,該年是否從與季度不同的日期開始,例如2018年3月1日
**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,則應返回以下內容:
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教程:Date Time解釋了如何使用java.time
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.