如何获取一年中的上一个/当前季度和年份的开始日期和结束日期,该日期的起始日期与Java中的01/01的日期不同

时间:2019-02-04 18:10:10

标签: java date calendar

我正在尝试实现一种返回以下内容的方法:

  • 当前季度日期
  • 上一个季度日期
  • 本年度
  • 上一年

我能够找出从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 将返回以下内容:

  • 当前季度:Start_Date = 9/1/2018 End_Date = 10/19/2018
  • 上一季度:Start_Date = 6/1/2018 End_Date = 8/30/2018
  • 本年:开始日期= 3/1/2018结束日期= 10/19/2018
  • 上一年:开始日期= 3/12017结束日期= 2/28/2018

1 个答案:

答案 0 :(得分:0)

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 tutorial: Date Time解释了如何使用java.time