问一个挑战智力的问题:) 你的问题可以通过Java提供的java.util.Calendar来解决。判断某天是星期几。不用自己想算法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不行吧,我看过Calendar的,就是不知道具体怎么做了:)不可能一天一天判断啊,要想个好的算法才行!! 1,算出开始日期到结束日期的天数 n2,n/7 * 40 + 边界情况(<=6天) import java.util.Calendar;public class CalendarTest { public static void main(String[] args) throws Exception { if (args.length != 6) { System.err.println("请给出年月日参数"); return; } Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, Integer.parseInt(args[0])); cal1.set(Calendar.MONTH, Integer.parseInt(args[1]) - 1); cal1.set(Calendar.DATE, Integer.parseInt(args[2])); Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, Integer.parseInt(args[3])); cal2.set(Calendar.MONTH, Integer.parseInt(args[4]) - 1); cal2.set(Calendar.DATE, Integer.parseInt(args[5])); if (cal1.after(cal2)) { System.out.println("请确保开始日期小于结束日期"); return; } long millsPerDay = 24 * 60 * 60 * 1000; int days = (int)((cal2.getTimeInMillis() - cal1.getTimeInMillis()) / millsPerDay) + 1; System.out.println("共有" + days + "天"); int weeks = days / 7; Calendar tmp = (Calendar)cal1.clone(); int workDays = 0; for (int i = 0; i < days % 7; i ++) { int dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK); tmp.add(Calendar.DATE, 1); if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) continue; workDays ++; } workDays += weeks * 5; System.out.println("共有工作天数: " + workDays); }}; 方案1: (计算总天数-休息日的天数) * 40 优点:算法简单 缺点:时间复杂度大方案2: 计算总天数/7*40+边界情况(<=6) 优点:时间复杂度低 确点:确定边界条件复杂方案3: 1.计算总天数N 2.起始日期beginDate是周几beginWeek 3.结束日期endDate是周几endWeek 4.if endDate-beginData+1>7 转到5 否则转到6 5.工作时间=N/7*40; boolean booNewWeek=false ; for (i=endDate-6;i<endDate+1;i++) { if (turnWeek=beginWeek){booNewWeek = true;} if (booNewWeek){ if turnWeek 非工作时间 工作时间+=40; 否则 continue } } 6.for (j=beginDate;j<endDate+1;j++) if turnDate(轮到的时间) 非休息日 工作时间+=40 否则 continue 优点:时间复杂度和2相同 比较和一相同-简单 缺点:综合思维要求高 接宝地一用Date型怎么向后+1例如2004-10-1怎么得到2004-10-2 //time 是2004-10-1的日期类型。Calendar cal = Calendar.getInstance();cal.setTime(time);cal.add(Calendar.DATE, 1);return cal.getTime(); 谢谢,各位帅哥:)昨天晚上我写了一个完成的测试用例,供参考和指正:)import java.util.Calendar;import java.util.Date;import java.text.DateFormat;import java.text.SimpleDateFormat;public class CalendarTest { public static void main(String[] args) throws Exception { if (args.length != 7) { System.err.println("请给出年月日参数"); return; } Calendar cal1 = Calendar.getInstance(); cal1.set(Calendar.YEAR, Integer.parseInt(args[0])); cal1.set(Calendar.MONTH, Integer.parseInt(args[1]) - 1); cal1.set(Calendar.DATE, Integer.parseInt(args[2])); Calendar cal2 = Calendar.getInstance(); cal2.set(Calendar.YEAR, Integer.parseInt(args[3])); cal2.set(Calendar.MONTH, Integer.parseInt(args[4]) - 1); cal2.set(Calendar.DATE, Integer.parseInt(args[5])); CalendarTest test = new CalendarTest(); test.getWorkDays(cal1, cal2); test.getFinishDay(cal1, Integer.parseInt(args[6])); } public int getWorkDays(Calendar startDay, Calendar finishDay) { int workDays = 0; long millsPerDay = 24 * 60 * 60 * 1000; int days = (int)(Math.ceil((finishDay.getTimeInMillis() - startDay.getTimeInMillis()) / (double)millsPerDay)) + 1; int weeks = days / 7; Calendar tmp = (Calendar)startDay.clone(); for (int i = 0; i < days % 7; i ++) { int dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK); tmp.add(Calendar.DATE, 1); if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) continue; workDays ++; } workDays += weeks * 5; System.out.println("共有" + days + "天"); System.out.println("共有工作天数: " + workDays); return workDays; } public Calendar getFinishDay(Calendar startDay, int workDays) { int weeks = workDays / 5; int durationDays = 0; //持续的天数。 DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); Calendar tmp = (Calendar) startDay.clone(); if (workDays % 5 != 0) { int dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK); while (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) { durationDays ++; System.out.println(df.format(tmp.getTime()) + "是休息日"); tmp.add(Calendar.DAY_OF_MONTH, 1); dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK); } durationDays += 1; } durationDays += weeks * 7; Calendar finishDay = (Calendar) startDay.clone(); finishDay.add(Calendar.DAY_OF_MONTH, durationDays - 1); System.out.println("持续工作天数: " + durationDays); System.out.println("结束日期: " + df.format(finishDay.getTime())); return finishDay; }}; 我往map放节点来模拟画图,这个map中元素的顺序是如何确定的呢? java程序访问一个网站次多了就被限制IP了怎么处理? select 标签多选问题 请教高手 a b JAVA能否监视粘贴板 duplicate class 问题 我的电脑》高级》环境变量的问题~~~~~~!!!!!!!!! 两个connection先后commit的问题 求大佬帮帮忙,怎么将从url获取的json字符串写入数据库,麻烦给点思路,万分感谢!!! 急问关于JNI的两个问题 sql语句查询,日期比较
2,n/7 * 40 + 边界情况(<=6天)
System.err.println("请给出年月日参数");
return;
} Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.YEAR, Integer.parseInt(args[0]));
cal1.set(Calendar.MONTH, Integer.parseInt(args[1]) - 1);
cal1.set(Calendar.DATE, Integer.parseInt(args[2])); Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.YEAR, Integer.parseInt(args[3]));
cal2.set(Calendar.MONTH, Integer.parseInt(args[4]) - 1);
cal2.set(Calendar.DATE, Integer.parseInt(args[5])); if (cal1.after(cal2)) {
System.out.println("请确保开始日期小于结束日期");
return;
} long millsPerDay = 24 * 60 * 60 * 1000;
int days = (int)((cal2.getTimeInMillis() - cal1.getTimeInMillis()) / millsPerDay) + 1;
System.out.println("共有" + days + "天");
int weeks = days / 7; Calendar tmp = (Calendar)cal1.clone(); int workDays = 0; for (int i = 0; i < days % 7; i ++) {
int dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK);
tmp.add(Calendar.DATE, 1);
if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) continue;
workDays ++;
} workDays += weeks * 5; System.out.println("共有工作天数: " + workDays);
}};
优点:算法简单
缺点:时间复杂度大
方案2: 计算总天数/7*40+边界情况(<=6) 优点:时间复杂度低
确点:确定边界条件复杂方案3:
1.计算总天数N
2.起始日期beginDate是周几beginWeek
3.结束日期endDate是周几endWeek
4.if endDate-beginData+1>7 转到5
否则转到6
5.工作时间=N/7*40;
boolean booNewWeek=false ;
for (i=endDate-6;i<endDate+1;i++) {
if (turnWeek=beginWeek){booNewWeek = true;}
if (booNewWeek){
if turnWeek 非工作时间 工作时间+=40;
否则 continue
}
}
6.for (j=beginDate;j<endDate+1;j++)
if turnDate(轮到的时间) 非休息日 工作时间+=40
否则 continue
优点:时间复杂度和2相同
比较和一相同-简单
缺点:综合思维要求高
Date型怎么向后+1
例如2004-10-1怎么得到2004-10-2
cal.setTime(time);
cal.add(Calendar.DATE, 1);return cal.getTime();
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;public class CalendarTest { public static void main(String[] args) throws Exception { if (args.length != 7) {
System.err.println("请给出年月日参数");
return;
} Calendar cal1 = Calendar.getInstance();
cal1.set(Calendar.YEAR, Integer.parseInt(args[0]));
cal1.set(Calendar.MONTH, Integer.parseInt(args[1]) - 1);
cal1.set(Calendar.DATE, Integer.parseInt(args[2])); Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.YEAR, Integer.parseInt(args[3]));
cal2.set(Calendar.MONTH, Integer.parseInt(args[4]) - 1);
cal2.set(Calendar.DATE, Integer.parseInt(args[5])); CalendarTest test = new CalendarTest();
test.getWorkDays(cal1, cal2);
test.getFinishDay(cal1, Integer.parseInt(args[6]));
}
public int getWorkDays(Calendar startDay, Calendar finishDay) {
int workDays = 0;
long millsPerDay = 24 * 60 * 60 * 1000; int days = (int)(Math.ceil((finishDay.getTimeInMillis() - startDay.getTimeInMillis()) / (double)millsPerDay)) + 1;
int weeks = days / 7;
Calendar tmp = (Calendar)startDay.clone(); for (int i = 0; i < days % 7; i ++) {
int dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK);
tmp.add(Calendar.DATE, 1);
if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) continue;
workDays ++;
} workDays += weeks * 5; System.out.println("共有" + days + "天");
System.out.println("共有工作天数: " + workDays); return workDays;
}
public Calendar getFinishDay(Calendar startDay, int workDays) { int weeks = workDays / 5;
int durationDays = 0; //持续的天数。 DateFormat df = new SimpleDateFormat("yyyy年MM月dd日"); Calendar tmp = (Calendar) startDay.clone(); if (workDays % 5 != 0) {
int dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK);
while (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.SATURDAY) {
durationDays ++;
System.out.println(df.format(tmp.getTime()) + "是休息日");
tmp.add(Calendar.DAY_OF_MONTH, 1);
dayOfWeek = tmp.get(Calendar.DAY_OF_WEEK);
}
durationDays += 1;
} durationDays += weeks * 7; Calendar finishDay = (Calendar) startDay.clone();
finishDay.add(Calendar.DAY_OF_MONTH, durationDays - 1);
System.out.println("持续工作天数: " + durationDays);
System.out.println("结束日期: " + df.format(finishDay.getTime())); return finishDay;
}
};