如何在java.util.Date中获取当前季度的第一个日期和最后一个日期

2022-09-04 23:40:49

我需要将当前季度的第一个日期作为java.util.Date对象,并将当前季度的最后一个日期作为java.util.Date对象。

我使用以下方法来获取本月的第一个日期和本月的最后一个日期。

private   Date getThisMonthFirstDate(){
    Calendar calendar = new GregorianCalendar();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    return calendar.getTime();
}

private   Date getThisMonthLastDate(){
    Calendar calandar = new GregorianCalendar();
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    calendar.set(Calendar.DAY_OF_MONTH,1);
    calendar.add(Calendar.MONTH, 1);
    calendar.add(Calendar.DATE, -1);
   return calendar.getTime();
}

有没有办法修改该功能来实现这一点,或者任何人都可以指出更好的方法?

假设 Q1 = 1 月 2 月 3 月,Q2 = 4 月、5 月、6 月等。


答案 1

纯 Java-8+ 解决方案:

LocalDate localDate = LocalDate.now();
LocalDate firstDayOfQuarter = localDate.with(localDate.getMonth().firstMonthOfQuarter())
    .with(TemporalAdjusters.firstDayOfMonth());

LocalDate lastDayOfQuarter = firstDayOfQuarter.plusMonths(2)
    .with(TemporalAdjusters.lastDayOfMonth());

答案 2

以下是Java 7或更早版本中的解决方案(否则,我建议检查其他答案):

private static Date getFirstDayOfQuarter(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3);
    return cal.getTime();
}

private static Date getLastDayOfQuarter(Date date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.set(Calendar.MONTH, cal.get(Calendar.MONTH)/3 * 3 + 2);
    cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
    return cal.getTime();
}

注1:java.util.Calendar 中的月份表示为从 0(1 月)到 11(12 月)
的整数注 2:Java 中的整数除以下限值(另一个整数值)。所以2/3 = 0,4/3 = 1,依此类推。因此,计算季度的零基指数:0(Q1),1(Q2),2(Q3),3(Q4)。
示例:日历中的 2 月为 1。因此,1 / 3 * 3 = 0。
如果提供 2 月日期,则季度的开始时间是 1 月 1 日(因为我们得到了 0),季度末是当月的最后一天 0 + 2 = 2(3 月)cal.get(Calendar.MONTH)/3 * 3