求java实现工作日方法

public Date NewDate(Date date,int num){}要求是传入一个日期,和一个num值,计算出除去非工作日以后的具体日期,非工作日包括周末和法定的节假日在内,比如传入的是2009-09-30,3,就必须从10月9号开始往后推10天,而且要出去周日就是2009-10-12(3个工作日就是9,10,11),求助高手怎么实现这个算法????

import java.text.DateFormat;

import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;

public class Test9 {

/**
* 第9题:编写程序,该程序启动后用户可以按“yyyy-MM-dd”的格式输入一个日期,程序计算这一天是星期几,并且计算出是一年中的第几天。
*
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {

Scanner scan = new Scanner(System.in);
System.out.println("请输入日期(格式为yyyy-mm-dd):");
String input = scan.next();
DateFormat format = DateFormat.getDateInstance();
Date date = format.parse(input);
Calendar ca = Calendar.getInstance();
ca.setTime(date); //设置输入时间
int xingqi = ca.get(Calendar.DAY_OF_WEEK);//获得输入日期是星期几?
System.out.println("您输入的日期是:"+input);
System.out.println("这一天是"+ GetWeek(xingqi));
System.out.println("这一天是这年的第"+ ca.get(Calendar.DAY_OF_YEAR)+"天");

}
public static String GetWeek(int i)
{
if(i<0||i>7){
System.out.println(i+"没有对应的星期");
}
String[] weeks={"","星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
return weeks[i];

}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-10
如果有数据库
就把节日和周末描入数据库中(周末的提取方法可以通过一个方法来抽取)
然后做一个算法循环向后取一天如果不是节假日就将第二个参数-1
这样就好了
第2个回答  2009-10-10
首先,我觉得这个问题没有什么比较难的算法可以解决。我在这说一下思路。仅供参考。
这个问题要解决。首先分两个方面。
1、对法定假日的判断。(设计程序时比较关键)
2、对正常公休日的判断。

在1中,最好通过配置文件读取数据来判断,因为每年的法定假日休息的天数不一样。还有这个方法别忘记返回一个串休的日期。例如今年10月10日。
在2中除了判断是周六还是周日外,要记得把1中返回的串休日合并计算。

题的思路在这了。但是我个人觉得写起来还是比较麻烦的。需要花点时间,但是应该不是很难。

仅共参考。希望还有高手有更好的办法。
第3个回答  推荐于2016-10-30
package com.brilliance.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

/**
* <br> * Title: * <br>
* <br> * Description: * <br>
* <br> * Copyright: 2009.10 * <br>
* <br> * Company: Brilliance * <br>
*
* @author yunfeiyang3210
* @version v1.0
*
*/
public class NextWorkDay {

public static Date getNextWorkDay(Date curDate, int num, List<Date> holidays) {
// 为节假日进行排序
Collections.sort(holidays, new Comparator<Date>() {
public int compare(Date arg0, Date arg1) {
if (arg0.getTime() > arg1.getTime())
return 1;
else if (arg0.getTime() < arg1.getTime())
return -1;
else
return 0;
}
});

Date beginDate = curDate;
Date endDate = curDate;
for (int i = 0; i < num; i++) {
endDate = new Date(endDate.getTime() + 24 * 60 * 60 * 1000);
int day_of_week = NextWorkDay.getDayOfWeek(endDate);
if (day_of_week == 1) {
beginDate = endDate;
endDate = new Date(endDate.getTime() + 24 * 60 * 60 * 1000);
} else if (day_of_week == 7) {
beginDate = endDate;
endDate = new Date(endDate.getTime() + 2 * 24 * 60 * 60 * 1000);
}
for (Date holiday : holidays) {
if (holiday.after(beginDate) && holiday.compareTo(endDate) == 0) {
beginDate = holiday;
endDate = new Date(endDate.getTime() + 24 * 60 * 60 * 1000);
}
}
}
return endDate;
}

public static Integer getDayOfWeek(Date date) {
Calendar cal = new GregorianCalendar();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_WEEK);
}

public static Date getDateFromString(String dateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}

public static void main(String[] args) {
String[] dateStr = { "2009-09-25", "2009-10-01", "2009-10-02",
"2009-10-03", "2009-10-04", "2009-10-05", "2009-10-06" };
List<Date> holidays = new ArrayList<Date>();
for (int i = 0; i < 7; i++) {
Date holiday = NextWorkDay.getDateFromString(dateStr[i]);
holidays.add(holiday);
}
Date nextWorkDay = NextWorkDay.getNextWorkDay(NextWorkDay
.getDateFromString("2009-09-30"), 3, holidays);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf.format(nextWorkDay));
}
}本回答被提问者采纳
第4个回答  2015-09-06

有很多实现方法,下面以switch...case为例说明(如图):

运行结果:

相似回答