黑马程序员技术交流社区
标题:
请教获取工作日休息日的问题
[打印本页]
作者:
doyxy
时间:
2014-3-26 20:32
标题:
请教获取工作日休息日的问题
本帖最后由 doyxy 于 2014-3-28 23:07 编辑
想做一个程序获取两个日期之间的工作日和休息日天数,当天数相差2天以内而且前面的日期大于后面的日期时,返回值错误,
比如 2014.03.26 - 2014.03.25 时,输出4,-4,
如果正序则正常,
发觉同一个星期时判断有问题,但是想不出怎么处理,求教应该怎么处理,谢谢!
import java.util.Calendar;
import java.util.Date;
public class Improve {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 练习4,获取两个日期间的工作天数和休息天数,包含头不包含尾.
// System.out.println("workdays:" + getWorkdays(2014, 2, 1, 2014, 1,
// 31));
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.set(2014, 2, 26);
c2.set(2014, 2, 25);
int workdays = getWorkdays(c1.getTime(), c2.getTime());
int restdays = getrestdays(c1.getTime(), c2.getTime());
System.out.println(c1.getTime());
System.out.println(c2.getTime());
System.out.println("workdays:" + workdays);
System.out.println("restdays:" + restdays);
}
private static int getrestdays(Date d1, Date d2) {
// TODO Auto-generated method stub
return (getTotaleDays(d1, d2)-getWorkdays(d1, d2));
}
private static int getWorkdays(Date d1, Date d2) {
// TODO Auto-generated method stub
// 获取两个日期间的总天数.
// 判断第一周和最后一周包含多少工作日和休息日 ow1,or1,ow2,or2.
// 总天数减去头尾两周的天数(ow1+or1+ow2+ow2)就是包含完整星期的天数,
// 除以7即得星期数,*5为工作日,*2为休息日,加上上面的工作日和休息日即得总的天数.
int workDays;
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
int days = getTotaleDays(d1, d2);//获取总天数
int ow1, or1, ow2, or2;
// 当两个时间在同一星期时出错
// 获取开始日期是星期几
int weekC1 = c1.get(Calendar.DAY_OF_WEEK);// 1-7代表星期日-星期六,
int weekC2 = c2.get(Calendar.DAY_OF_WEEK);
/*
* 第一周
* 1-SUNDAY ow+5 or+2
* 2-MONDAY ow+5 or+1
* 3-TUESDAY ow+4 or+1
* 4-WEDNESDAY ow+3 or+1
* 5-THURSDAY ow+2 or+1
* 6-FRIDAY ow+1 or+1
* 7-SATURDAY ow+0 or+1
* 除了SUNDAY ow = 7-weekC1,or=1;
*/
// 获取第一周的工作日ow1和休息日or1天数.
if (weekC1 == 1) {
ow1 = 5;
or1 = 2;
} else {
ow1 = 7 - weekC1;
or1 = 1;
}
/*
* 最后一周,因为不包含最后一天
* 1-SUNDAY ow+0 or+0
* 2-MONDAY ow+0 or+1
* 3-TUESDAY ow+1 or+1
* 4-WEDNESDAY ow+2 or+1
* 5-THURSDAY ow+3 or+1
* 6-FRIDAY ow+4 or+1
* 7-SATURDAY ow+5 or+1
* 除了SUNDAY ow=weekC2-2, or=1;
*/
// 获取最后一周的工作日ow2和休息日or2天数.
if (weekC2 == 1) {
ow2 = 0;
or2 = 0;
} else {
ow2 = weekC2 - 2;
or2 = 1;
}
int fullWeeks;
// 完整星期的天数
fullWeeks = (days - ow1 - or1 - ow2 - or2) / 7;
// System.out.println("完整星期数:"+fullWeeks);
// System.out.println("ow1="+ow1+",ow2="+ow2);
workDays = fullWeeks * 5 + ow1 + ow2;
return workDays;
}
private static int getTotaleDays(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
// 判断c1和c2的大小,保证c1在前,c2在后.
if (c1.compareTo(c2) > 0) {
c1.setTime(d2);
c2.setTime(d1);
System.out.println("c1>c2");
}
// 获取c1和c2间的天数
int days = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24));
// System.out.println(days);
return days;
}
}
复制代码
作者:
董振冬
时间:
2014-3-28 11:45
首先 时间相差天数,你只是证明的了哪个在前哪个在后,输出值也没变,有可能是负数也有可能是正数,把比较后的结果要作用 在结果上。这是我的代码
作者:
董振冬
时间:
2014-3-28 11:47
//得到两个日期相差的天数
int days1 = ((int) (c2.getTime().getTime() / 1000) - (int) (c1
.getTime().getTime() / 1000)) / 3600 / 24;
System.out.println(c1.getTime());
System.out.println(c2.getTime());
if(days1 > 0){
System.out.println("相差"+days1+"天");
return days1;
}else{
int days2 = 0 - days1;
System.out.println("相差"+days2+"天");
return days2;
}
其次,你上面也注释了 // 当两个时间在同一星期时出错
出错也是应该的, 这是你计算星期天的代码 fullWeeks = (days - ow1 - or1 - ow2 - or2) / 7;
如果是周一到周三,工作了三天总的天数是三,0除7肯定不能进行啊,所以你要判读他们是不是在同一周,如果是的话,重新写一个判断方法
不知道你注意到了没:calendar存储月份是从0开始存储的 即0就是1月
作者:
doyxy
时间:
2014-3-28 14:02
感谢楼上,不过我自己重新想了个办法,我错在判断第一周和最后一周的工作日和休息日直接用赋值,重新写了一个,请大家指点
import java.util.Calendar;
import java.util.Date;
public class GetWorkDays {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 获取两个日期之间的工作日天数
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.set(2014, 2, 2);
c2.set(2014, 2, 1);
System.out.println(c1.getTime());
System.out.println(c2.getTime());
System.out.println("workdays:"
+ getWorkdays(c1.getTime(), c2.getTime()));
System.out.println("restdays:"
+ getRestdays(c1.getTime(), c2.getTime()));
}
private static int getRestdays(Date d1, Date d2) {
// TODO Auto-generated method stub
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
if (d1.compareTo(d2) > 0) {
c1.setTime(d2);
c2.setTime(d1);
}
int totalDays = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24));
return totalDays - getWorkdays(d1, d2);
}
private static int getWorkdays(Date d1, Date d2) {
// TODO Auto-generated method stub
int workdays = 0;
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
// 如果d2在d1之前,将两个日期互换.
if (d1.compareTo(d2) > 0) {
c1.setTime(d2);
c2.setTime(d1);
}
// 此时d1在d2之前.
// 获取d1和d2之间的天数.
int totalDays = (int) ((c2.getTimeInMillis() - c1.getTimeInMillis()) / (1000 * 3600 * 24));
int weekC1 = c1.get(Calendar.DAY_OF_WEEK);
int weekC2 = c2.get(Calendar.DAY_OF_WEEK);
// 如果d1和d2之间没有完整的星期
// 并且d1和d2在同一个星期
if (totalDays < 7
&& c1.get(Calendar.WEEK_OF_YEAR) == c2
.get(Calendar.WEEK_OF_YEAR)) {
// 如果d1为星期天
if (weekC1 == 1) {
workdays = weekC2 - weekC1 - 1;
} else {
workdays = weekC2 - weekC1;
}
} else {// 如果d1和d2不在同一星期
// 分别获取d1和d2所在星期的工作日天数
int workdays1, workdays2;
if (weekC1 == 1) {
workdays1 = 7 - weekC1 - 1;
} else {
workdays1 = 7 - weekC1;
}
if (weekC2 == 1 || weekC2 == 2) {
workdays2 = 0;
} else {
workdays2 = weekC2 - 2;
}
// 获取d1和d2之间有多少个完整的星期
// 总天数减去第一个星期和最后一个星期的天数/7
int fullWeeks = (totalDays - (7 - weekC1 + 1) - (weekC2 - 1)) / 7;
// 总的工作日
workdays = fullWeeks * 5 + workdays1 + workdays2;
}
return workdays;
}
}
复制代码
作者:
doyxy
时间:
2014-3-28 14:52
无语,发现跨年的话会出错,打印两个时间的毫秒值发现差1,看来在Calendar.getInstance()的时候出的问题,直接用new Date就没问题了,感觉new Date创建时间很好用啊,怎么就过时了呢....
snap0031.png
(130.22 KB, 下载次数: 53)
下载附件
2014-3-28 14:52 上传
作者:
doyxy
时间:
2014-3-28 16:42
最终修改版 测试了两个日期在同一星期,在相邻星期,跨年相邻星期,都没问题,各位看看还有什么地方要改进的吗?
package SystemTest;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class GetWorkdays {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
// 获取两个日期之间的工作日天数
GregorianCalendar c1 = new GregorianCalendar(2014, 0, 8);
GregorianCalendar c2 = new GregorianCalendar(2014, 0, 10);
System.out.println("workdays:" + getWorkdays(c1, c2));
System.out.println("restdays:" + getRestdays(c1, c2));
}
private static int getRestdays(GregorianCalendar g1, GregorianCalendar g2) {
// TODO Auto-generated method stub
if (g1.after(g2)) {
GregorianCalendar temp = g1;
g1 = g2;
g2 = temp;
}
int totalDays = (int) ((g2.getTimeInMillis() - g1.getTimeInMillis()) / (1000 * 3600 * 24));
return totalDays - getWorkdays(g1, g2);
}
private static int getWorkdays(GregorianCalendar g1, GregorianCalendar g2) {
// TODO Auto-generated method stub
int workdays = 0;
// 如果g2在g1之前,将两个日期互换.
if (g1.after(g2)) {
GregorianCalendar temp = g1;
g1 = g2;
g2 = temp;
}
// 获取g1和d2之间的天数.
int totalDays = (int) ((g2.getTimeInMillis() - g1.getTimeInMillis()) / (1000 * 3600 * 24));
int weekC1 = g1.get(Calendar.DAY_OF_WEEK);
int weekC2 = g2.get(Calendar.DAY_OF_WEEK);
// 分别获取d1和d2所在星期的工作日天数
int workdays1, workdays2;
if (weekC1 == 1) {
workdays1 = 7 - weekC1 - 1;
} else {
workdays1 = 7 - weekC1;
}
if (weekC2 == 1 || weekC2 == 2) {
workdays2 = 0;
} else {
workdays2 = weekC2 - 2;
}
// 获取d1和d2之间有多少个完整的星期
// 总天数减去第一个星期和最后一个星期的天数/7
int fullWeeks = (totalDays - (7 - weekC1 + 1) - (weekC2 - 1)) / 7;
// 总的工作日
workdays = fullWeeks * 5 + workdays1 + workdays2;
// }
return workdays;
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2