簡體   English   中英

如何獲取一年中的上一個/當前季度和年份的開始日期和結束日期,該日期開始於Java中與01/01不同的日期

[英]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,則應返回以下內容:

  • 當前季度:開始日期= 9/1/2018結束日期= 10/19/2018
  • 上一季度:開始日期= 6/1/2018結束日期= 8/30/2018
  • 當前年份:開始日期= 3/1/2018結束日期= 10/19/2018
  • 上一年:開始日期= 3/12017結束日期= 2/28/2018

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);

上面的摘錄輸出的年份為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM