首页 > 解决方案 > 使用Java查找给定上一个季度结束日期的下一个季度结束日期

问题描述

我有上个季度的季度结束日期,顺其自然30-09-20,要求是找到下个季度的结束日期,即31-12-20。我正在使用下面的代码来做同样的事情,但它在某些情况下会给出错误的输出。该解决方案对所有方面都应该是正确的。

String str = "30-09-20";
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yy");
Date date = format.parse(str);
Date newDate = DateUtils.addMonths(date, 3);
System.out.println(newDate);//Dec 30 - It should be 31 Dec

标签: javadatedatetimejava-8apache-commons-dateutils

解决方案


要回答您的问题,我认为您正在寻找这个:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yy");
LocalDate end = LocalDate.parse("30-09-20", formatter)
    .plusMonths(3)                             // add three months to your date
    .with(TemporalAdjusters.lastDayOfMonth()); // with the last day of the month

注意:不要使用旧的 Date 库,您标记了您的问题 Java-8,这意味着您可以使用java-time API。


获取当前季度的最后一天

@deHaar有理由,要获得当前季度的结束日期,我建议使用:

public LocalDate lastDayFromDateQuarter(String date) {
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yy");
    LocalDate ld = LocalDate.parse(date, formatter);
    int quarter = ld.get(IsoFields.QUARTER_OF_YEAR); // Get the Quarter, 1, 2, 3, 4
    // Then create a new date with new quarter * 3 and last day of month
    return ld.withMonth(quarter * 3).with(TemporalAdjusters.lastDayOfMonth());
}

获取下一季度的最后一天

要获得下个季度的最后一天,您只需将日期添加三个月,如下所示:

public static LocalDate lastDayFromDateQuarter(String date) {
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yy");
    LocalDate ld = LocalDate.parse(date, formatter);
    int quarter = ld.get(IsoFields.QUARTER_OF_YEAR);
    return ld.withMonth(quarter * 3)
            .plusMonths(3)
            .with(TemporalAdjusters.lastDayOfMonth());
}

推荐阅读