Java查找给定日期的工作日

Java查找给定日期的工作日,java,Java,我需要找到给定日期的工作日。 给定日期为2080-03-20 现在,我需要找到一个工作日后5天,从给定的日期 它应返回: 2080-03-25 我试过这个: import java.text.ParseException; import java.text.SimpleDateFormat; import java.util; Date date=new Date(); Calendar calendar = Calendar.getInstance(); date = calendar.ge

我需要找到给定日期的工作日。 给定日期为2080-03-20 现在,我需要找到一个工作日后5天,从给定的日期

它应返回: 2080-03-25

我试过这个:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util;

Date date=new Date();
Calendar calendar = Calendar.getInstance();
date = calendar.getTime()
SimpleDateFormat s
s= new SimpleDateFormat("yyyy-MM-dd")
Date today = new Date();
SimpleDateFormat formatedDate = new SimpleDateFormat ("yyyy-MM-dd")
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, 21916);
String after60years = (String)(formattedDate.format(c.getTime()))
int days = 5;
for (int i=0;i<days;)
{
calendar.add(Calendar.DAY_OF_MONTH, 1)
if(calendar.get(Calendar.DAY_OF_WEEK)<-5)
{
i++;
}
}
date = calendar.getTime();
s=new SimpleDateFormat("yyyy=MM-dd");
System.println(s.format(date+21916));
import java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util;
日期=新日期();
日历=Calendar.getInstance();
date=calendar.getTime()
简化格式
s=新的简化格式(“yyyy-MM-dd”)
今天日期=新日期();
SimpleDataFormat FormateDate=新SimpleDataFormat(“yyyy-MM-dd”)
Calendar c=Calendar.getInstance();
c、 添加(日历日期,21916);
60年后的字符串=(字符串)(formattedDate.format(c.getTime()))
整数天=5天;

对于(int i=0;i使用
java.time

public LocalDate weekdayafter5天(LocalDate){
var目标=日期加星期五(5);
var weekday=target.getDayOfWeek();
如果(weekday==DayOfWeek.SATURDAY | | weekday==DayOfWeek.SUNDAY){
var nextMonday=临时调整器.nextOrSame(星期一星期五);
target=target.with(下周一);
}
回报目标;
}
如果日期以字符串形式给出,格式为
yyyy-MM-dd
,只需创建一个
LocalDate

var-date=LocalDate.parse(文本);
或者,对于不同的格式(例如,
dd/MM/yyyy
):

var-date=LocalDate.parse(模式(“dd/MM/yyyy”)的文本、DateTimeFormatter.of;

Java8
提供了具有丰富功能的
java.time
库。您可以尝试以下示例代码

public class TimeTest {

   private static TemporalAdjuster TEMPORAL_ADJUSTER = TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY);
   private static List<DayOfWeek> OFF_DAYS = Arrays.asList(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);

   public static void main(String[] args) {

    LocalDate localDate = LocalDate.parse("2080-03-20");

    long daysToPlus = 5l;
    for (int day = 1; day <= daysToPlus; day++) {

        localDate = localDate.plusDays(1);
        if (OFF_DAYS.contains(localDate.getDayOfWeek())) {
            localDate = localDate.with(TEMPORAL_ADJUSTER);
        }
    }

    System.out.println(localDate);
    System.out.println(localDate.getDayOfWeek());
  }
}
公共类时间测试{
专用静态临时调整器临时调整器=临时调整器.nextOrSame(星期一,星期一);
私有静态列表OFF_DAYS=Arrays.asList(DayOfWeek.SATURDAY,DayOfWeek.SUNDAY);
公共静态void main(字符串[]args){
LocalDate LocalDate=LocalDate.parse(“2080-03-20”);
长日stoplus=5l;
太长了,读不下去了(1天;
java.time
您正在使用可怕的日期时间类,这些类在几年前被JSR310中定义的现代java.time类所取代

TemporalAdjuster
显然,你想把未来的某一天移到某个特定的时间,但不包括周六和周日的周末

在java.time中,我们通过
临时调整器
移动到另一个日期

额外加三十 你可以写你自己的调整为跳过周末

nextWorkingDay
但没有必要,我们在Three Ten Extra library中提供了一个实现:

使用该调节器循环计算天数

LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDate date = today ;
int daysAhead = 5 ;
List< LocalDate > dates = new ArrayList<>( daysAhead ) ;
for( int i = 1 ; i <= daysAhead ; i ++ ) 
{
    date = date.with( ta ) ;
    dates.add( date ) ;
}

有些不相关:我建议使用Java 8中添加的。我在代码中犯了一个错误,我找到了方法,但我不确定,我只需要指南。你需要立即删除
日历
日期
SimpleDateFormat
,并开始使用更新的Java日期和时间API。这段代码充满了错误、不必要的代码和错误广告格式有点难以理解您的意图。请阅读:为什么有
dtf
LocalDate.parse(“2080-03-20”)
没有
DateTimeFormatter
可以解析。--此代码的哪一部分将“找到工作日”,即确保日期不是周末(周六或周日)太多了。如果我需要排除假期,我怎么能do@psLaVerriere你有什么地方的假期列表吗?是的,安德烈亚斯,这些是假期:2080-12-312080-04-042080-04-062080-05-112080-05-192080-06-152080-06-302080-08-042080-09-012080-11-10280-12-242080-12-25谢谢Basil Bourques这段代码的哪一部分会被删除“查找工作日”,即确保日期不是周末(星期六或星期日)?代码的开销非常大。若要修复:1)而不是DayOfWeek。从(目标),使用target.getDayOfWeek()--2)而不是创建临时调整器,请编写if(星期六){add 2天}否则if(星期日){add 1天}
。问题是要求“在给定日期后的5天内查找工作日”,而不是“在给定日期后的5个工作日内查找日期”。问题示例为
2080-03-20
(星期三),预期输出为
2080-03-25
(星期一)。答案中的当前代码将导致
2080-03-27
(星期三)“@Andreas这种解释与标题和第一句话相矛盾。但是,很好,我在答案的顶部和底部也添加了代码。
TemporalAdjuster ta = org.threeten.extra.Temporals.nextWorkingDay() ;
LocalDate today = LocalDate.now( ZoneId.of( "Africa/Tunis" ) ) ;
LocalDate date = today ;
int daysAhead = 5 ;
List< LocalDate > dates = new ArrayList<>( daysAhead ) ;
for( int i = 1 ; i <= daysAhead ; i ++ ) 
{
    date = date.with( ta ) ;
    dates.add( date ) ;
}
LocalDate today = LocalDate.now( ZoneId.of( "Asia/Tokyo" ) ) ;
int daysAhead = 5 ;
LocalDate later = today.plusDays( daysAhead ) ;
LocalDate date = later.with( org.threeten.extra.Temporals.nextWorkingDayOrSame() ) ;