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

M06*_*06H 3 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);
}
Run Code Online (Sandbox Code Playgroud)

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

小智 6

另一种方法是使用a 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));
}
Run Code Online (Sandbox Code Playgroud)

今日运行这段代码(10月2日 2017年),它给了lastDayPreviousMonth等于2017-09-29.


PS:minusMonthsLocalDate实例中使用,它不会总是像你想要的那样工作.例如,如果我在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
Run Code Online (Sandbox Code Playgroud)

2017年2月的最后一天是28 ,当minusMonths(1)您打电话时,您会在上个月(1月)的同一天( 28天)获得,这不是您想要的(2017年1月的最后一个工作日是31 ).

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


VGR*_*VGR 4

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

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