我们在用 Java 开发后台的时候,有时需要对数据进行特定时间段统计汇总,比如需要筛选上一季度的数据。那么如何获取上一季度起止日期和时间呢?从 Java8 开始实现更简单,具体如下:

源码:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDate nowDate = LocalDate.ofInstant(Instant.now(), ZoneId.systemDefault());

// 当前月份减去 3 个月,即落在上个季度中,通过 firstMonthOfQuarter 获取所在季度第一个月
Month firstMonthOfQuarter = nowDate.minusMonths(3).getMonth().firstMonthOfQuarter();

// 所在季度第一个月加上 2,即为所在季度最后一个月
Month endMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);

// 获得上面得到的季度第一个月的第一天
LocalDate beginDate = LocalDate.of(nowDate.getYear(), firstMonthOfQuarter, 1);

// 获得上面得到的季度最后一个月的最后一天
LocalDate endDate = LocalDate.of(nowDate.getYear(), endMonthOfQuarter, endMonthOfQuarter.length(beginDate.isLeapYear()));

// 获取季度开始时间
LocalDateTime beginTime = LocalDateTime.of(beginDate, LocalTime.MIN);

// 获取季度结束时间
LocalDateTime endTime = LocalDateTime.of(endDate, LocalTime.MAX);

System.out.println("上个季度开始日期:" + beginDate);
System.out.println("上个季度结束日期:" + endDate);
System.out.println("上个季度开始时间:" + beginTime.format(dateTimeFormatter));
System.out.println("上个季度结束时间:" + endTime.format(dateTimeFormatter));

运行结果输出:

上个季度开始日期:2022-01-01
上个季度结束日期:2022-03-31
上个季度开始时间:2022-01-01 00:00:00
上个季度结束时间:2022-03-31 23:59:59

知识点:

  • LocalDate 中的 boolean isLeapYear():判断是否闰年
  • Month 中的 int length(boolean leapYear):获取月份天数
  • LocalTime.MIN:支持的最小本地时间:00:00
  • LocalTime.MAX:支持的最大本地时间:23:59:59.999999999
如果觉得我的文章对你有用,请随意赞赏