Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有LocalDate的上个月的最后一个工作日_Java_Date_Java Time_Localdate - Fatal编程技术网

Java 具有LocalDate的上个月的最后一个工作日

Java 具有LocalDate的上个月的最后一个工作日,java,date,java-time,localdate,Java,Date,Java Time,Localdate,上面给出了当月的最后一个工作日。如何获得上一个月的最后一个工作日来调整上述内容 有时候,简单的方法比聪明的方法好: public static String getLastWorkingDayOfPreviousMonth() { LocalDate lastDayOfCurrentMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()); LocalDate lastWorkingDayOfMonth;

上面给出了当月的最后一个工作日。如何获得上一个月
的最后一个工作日来调整上述内容

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

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);
}

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

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

这里,在本例中,我计算的是上个月的最后一天(您可以通过更改方法
minusMonths()
的参数中的整数值来更改前几个月)对于周末和周末,工作日会相应地改变。

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

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();
    }
今天(2017年10月2日)运行此代码,它给出的
lastDayPreviousMonth
等于
2017-09-29


PS:您在
LocalDate
实例中使用的是
minusMonths
,它不会总是像您希望的那样工作。例如,如果我的日期是2017年2月:

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));
}
2017年2月的最后一天是28日,在调用
minus months(1)
时,您会得到上个月(1月)的同一天(28日),这不是您想要的(2017年1月的最后一个工作日是31日)


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

您可以将
LocalDate.now()替换为(temporaladjusts.lastDayOfMonth())
在您的代码中,使用(TemporalAdjusters.lastDayOfMonth())获取上个月的最后一天,然后继续使用相同的逻辑查找当月的最后一个工作日。

tl;博士
上一个工作日
该项目提供了查找/工作日(非周六/周日)的实现

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

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

更简单、更容易的方法,无需循环

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() ) ;

lastWorkingDayOfMonth=当前月份的LastDayOfMonth.minusMonths(1)???这会让你得到上个月的最后一天,而不是最后一个工作日。你的意思是使用
minusDays(…)
来代替吗?至于上个月的最后一个工作日:一旦你的代码被修复,只需将
lastdayofcurrentmount.minusMonths(1)
添加到你的switch语句中,例如
switch(lastdayofcurrentmount.minusMonths(1.getDayOfWeek())
(注意方法
getDayOfWeek())
这缩短了语句,从而极大地提高了可读性)。谢谢-我知道哪里出了问题。我更新了当前月的最后一天
minusMonths(1)至当前月份的最后一天。天数(1)
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() ) ;
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);
}