使用LocalDate上个月的最后一个工作日

时间:2017-10-02 14:51:25

标签: java date java-time localdate

public static String getLastWorkingDayOfPreviousMonth() {

    LocalDate lastDayOfCurrentMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
    LocalDate lastWorkingDayOfMonth;

    switch (DayOfWeek.of(lastDayOfCurrentMonth.get(ChronoField.DAY_OF_WEEK))) {
        case SATURDAY:
            lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1);
            break;
        case SUNDAY:
            lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(2);
            break;
        default:
            lastWorkingDayOfMonth = lastDayOfCurrentMonth;
    }

    return getFormattedDate(lastWorkingDayOfMonth);
}

以上是本月的最后一个工作日。如何调整上述Previous月的最后一个工作日?

6 个答案:

答案 0 :(得分:6)

另一种方法是使用java.time.YearMonth来获取上个月。然后你会得到本月的最后一天,如果是在周末,则调整到上周五:

LocalDate lastDayPreviousMonth = YearMonth
    // current year/month
    .now()
    // previous month
    .minusMonths(1)
    // last day of month
    .atEndOfMonth();
DayOfWeek dayOfWeek = lastDayPreviousMonth.getDayOfWeek();
// check if it's weekend
if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) {
    // adjust to previous friday
    lastDayPreviousMonth = lastDayPreviousMonth.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
}

今天运行此代码(10月2日 nd 2017),它使lastDayPreviousMonth等于2017-09-29

PS:您在minusMonths个实例中使用LocalDate,这些实例不会像您想要的那样始终正常工作。例如,如果我在2017年2月有一个日期:

// Feb 15th 2017
LocalDate d = LocalDate.of(2017, 2, 15);
// adjust to last day of month (2017-02-28)
d = d.with(TemporalAdjusters.lastDayOfMonth());
System.out.println(d.minusMonths(1)); // 2017-01-28

2017年2月的最后一天是28 th ,当致电minusMonths(1)时,您在上个月获得同一天(28 th )( 1月),这不是你想要的(2017年1月的最后一个工作日是31 st )。

使用YearMonth可以避免这种情况,因为这个类只处理月份和年份,忽略了一天(因此minusMonths不会受到这样的影响)。因此,您可以轻松地转到所需的月份,然后使用atEndOfMonth()方法正确地获取最后一天。

答案 1 :(得分:2)

有时候,简单的方法比聪明的方法更好:

LocalDate lastWorkingDayOfMonth = LocalDate.now().withDayOfMonth(1);
do {
    lastWorkingDayOfMonth = lastWorkingDayOfMonth.minusDays(1);
} while (lastWorkingDayOfMonth.getDayOfWeek() == DayOfWeek.SATURDAY ||
         lastWorkingDayOfMonth.getDayOfWeek() == DayOfWeek.SUNDAY);

答案 2 :(得分:2)

您可以使用以下代码更改switch语句:

public static String getLastWorkingDayOfPreviousMonth() {

        LocalDate lastDayOfCurrentMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
        LocalDate lastWorkingDayOfMonth;
        switch (lastDayOfCurrentMonth.minusMonths(1).getDayOfWeek()) {
            case SATURDAY:
                lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1).minusDays(1); // Here assgining second last day from previous month.
                break;
            case SUNDAY:
                lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1).minusDays(2); // Here assgining third last day from previous month.
                break;
            default:
                lastWorkingDayOfMonth = lastDayOfCurrentMonth.minusMonths(1); // Here assgining last day from previous month.
        }

        return lastWorkingDayOfMonth.toString();
    }

在这种情况下,在这种情况下,我计算上个月的最后一天(您可以通过更改方法minusMonths()的参数中的整数值来更改前几个月)和周末以及周末工作情况一天相应改变。

答案 3 :(得分:2)

TL;博士

LocalDate.now()
         .withDayOfMonth( 1 ) 
         .with( 
             org.threeten.extra.Temporals.previousWorkingDay()
          )

previousWorkingDay

ThreeTen-Extra项目提供了TemporalAdjuster个实施,用于查找next / previous工作日(非星期六/星期日)。

上个月的最后一天可能是工作日的目标。因此,我们的策略是在这个月的第一天,回顾前一个工作日。

ZoneId z = ZoneId.of( "America/Montreal" ) ; 
LocalDate today = LocalDate.now( z );
LocalDate firstOfMonth = today.withDayOfMonth( 1 ) ;
LocalDate lastWorkingDayOfPreviousMonth = firstOfMonth.with( org.threeten.extra.Temporals.previousWorkingDay() ) ;

答案 4 :(得分:1)

没有循环的更简单方便。

public static String getLastWorkingDayOfPreviousMonth() {
    LocalDate localDate = LocalDate.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth());
    if (localDate.getDayOfWeek().getValue() > 5)
        localDate = localDate.minusDays(localDate.getDayOfWeek().getValue() - 5);
    return getFormattedDate(localDate);
}

答案 5 :(得分:0)

您可以替换LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()) 在您的代码中LocalDate.now().minusMonth(1).with(TemporalAdjusters.lastDayOfMonth())获取上个月的最后一天,之后继续使用相同的逻辑来查找该月的最后一个工作日。