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
月的最后一个工作日?
答案 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)
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())
获取上个月的最后一天,之后继续使用相同的逻辑来查找该月的最后一个工作日。