您的位置:首页 > 其它

计算两个时间戳之间的工作日间隔时间(9:30-12:00 13:00-18.30)

2015-07-22 15:15 507 查看
package com.hxjr.utils.date;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
* 计算任意2个日期内的工作日(没有考虑到国定假日)
*
* @author user
*
*/
public class DateCal {

/**
* @param args
*/
public static void main(String[] args) {
try {
String strDateStart = "2015-07-16 08:15:00";
String strDateEnd = "2015-07-16 13:40:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date_start = sdf.parse(strDateStart);
Date date_end = sdf.parse(strDateEnd);

DateCal app = new DateCal();
Calendar cal_start = Calendar.getInstance();
Calendar cal_end = Calendar.getInstance();
cal_start.setTime(date_start);
cal_end.setTime(date_end);
System.out.println("星期-->" + app.getChineseWeek(cal_start)
+ " 日期-->" + cal_start.get(Calendar.YEAR) + "-"
+ (cal_start.get(Calendar.MONTH) + 1) + "-"
+ cal_start.get(Calendar.DAY_OF_MONTH));
System.out.println("星期-->" + app.getChineseWeek(cal_end) + " 日期-->"
+ cal_end.get(Calendar.YEAR) + "-"
+ (cal_end.get(Calendar.MONTH) + 1) + "-"
+ cal_end.get(Calendar.DAY_OF_MONTH));
System.out.println("工作日为--(按小时)>"
+ app.getWorkingDay(cal_start, cal_end)/(3600*1000*1.0));
System.out.println("工作日時間为--(按毫秒)>"
+ app.getWorkingDay(cal_start, cal_end));
} catch (Exception e) {
// TODO: handle exception
}
}

public int getDaysBetween(java.util.Calendar d1, java.util.Calendar d2) {
if (d1.after(d2)) {
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}
int days = d2.get(java.util.Calendar.DAY_OF_YEAR)
- d1.get(java.util.Calendar.DAY_OF_YEAR);
int y2 = d2.get(java.util.Calendar.YEAR);
if (d1.get(java.util.Calendar.YEAR) != y2) {
d1 = (java.util.Calendar) d1.clone();
do {
days += d1.getActualMaximum(java.util.Calendar.DAY_OF_YEAR);
d1.add(java.util.Calendar.YEAR, 1);
} while (d1.get(java.util.Calendar.YEAR) != y2);
}
return days;
}

/**
* 计算2个日期之间的相隔天数
*
* @param d1
* @param d2
* @return
*/
public Long getWorkingDay(java.util.Calendar d1, java.util.Calendar d2) {

int result = -1;
long result1 = -1;
if (d1.after(d2)) { // swap dates so that d1 is start and d2 is end
java.util.Calendar swap = d1;
d1 = d2;
d2 = swap;
}
/*//如果两个时间在同一周并且都不是周末日期,则直接返回时间差,增加执行效率
if(d1.get(Calendar.YEAR)==d2.get(Calendar.YEAR)
&& d1.get(Calendar.WEEK_OF_YEAR)==d2.get(Calendar.WEEK_OF_YEAR)
&& d1.get(Calendar.DAY_OF_WEEK)!=1 && d2.get(Calendar.DAY_OF_WEEK)!=7
&& d1.get(Calendar.DAY_OF_WEEK)!=1 && d2.get(Calendar.DAY_OF_WEEK)!=7){
return new Long(d2.getTimeInMillis()-d1.getTimeInMillis());
}*/
long charge_start_date = 0;// 开始日期的日期偏移量
long charge_end_date = 0;// 结束日期的日期偏移量
// 日期不在同一个日期内
if (d1.get(Calendar.DAY_OF_WEEK)!= 1 && d1.get(Calendar.DAY_OF_WEEK)!=7) {// 开始日期为星期六和星期日时偏移量为0
charge_start_date += (7-d1.get(Calendar.DAY_OF_WEEK))*8*3600000;
System.out.println(d1.getTime().getHours()+":"+d1.getTime().getMinutes());
if(d1.getTime().getHours()>=9&&d1.getTime().getMinutes()>=30||d1.getTime().getHours()>=10){
if(d1.getTime().getHours()>=13){
charge_start_date -= (d1.getTime().getHours()-13+2.5)*60000*60;
charge_start_date -= d1.get(Calendar.MINUTE)*60000;
charge_start_date -= d1.get(Calendar.SECOND)*1000;
charge_start_date -= d1.get(Calendar.MILLISECOND);
}else if(d1.getTime().getHours()>=18&&d1.getTime().getMinutes()>=30){
charge_start_date -= 8*3600000;
}else if(d1.getTime().getHours()>=12&&d1.getTime().getHours()<13){
charge_start_date -= 2.5*60000*60;
}else if(d1.getTime().getHours()<12){
System.out.print("aaa<12");
charge_start_date -= (d1.getTime().getHours()-9)*60000*60;
charge_start_date -= d1.get(Calendar.MINUTE)*60000-30*60000;
charge_start_date -= d1.get(Calendar.SECOND)*1000;
charge_start_date -= d1.get(Calendar.MILLISECOND);
}

}

}
if (d2.get(Calendar.DAY_OF_WEEK)!= 1 && d2.get(Calendar.DAY_OF_WEEK)!=7) {// 结束日期为星期六和星期日时偏移量为0
//只有在结束时间为非周末的时候才计算偏移量
charge_end_date += (7-d2.get(Calendar.DAY_OF_WEEK))*8*3600000;
if(d2.getTime().getHours()>=9&&d2.getTime().getMinutes()>=30||d2.getTime().getHours()>=10){
System.out.print("aaa>13");
if(d2.getTime().getHours()>=13){
System.out.print("aaa>13");
charge_end_date -= (d2.getTime().getHours()-13+2.5)*60000*60;
charge_end_date -= d2.get(Calendar.MINUTE)*60000;
charge_end_date -= d2.get(Calendar.SECOND)*1000;

charge_end_date -= d2.get(Calendar.MILLISECOND);
}else if(d2.getTime().getHours()>=18&&d2.getTime().getMinutes()>=30){
charge_end_date -= 8*3600000;
}else if(d2.getTime().getHours()>=12&&d2.getTime().getHours()<13){
System.out.print("aaa>12");
charge_end_date -= 2.5*60000*60;
}else if(d2.getTime().getHours()<12){
charge_end_date -= (d2.getTime().getHours()-9)*60000*60;
charge_end_date -= d2.get(Calendar.MINUTE)*60000-30*60000;
charge_end_date -= d2.get(Calendar.SECOND)*1000;
charge_end_date -= d2.get(Calendar.MILLISECOND);
}

}

}
result = (getDaysBetween(this.getNextMonday(d1), this.getNextMonday(d2)) / 7)* 5;
result1 =  result*8*3600000+charge_start_date-charge_end_date;

return result1;
}

public String getChineseWeek(Calendar date) {
final String dayNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五",
"星期六" };

int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);

// System.out.println(dayNames[dayOfWeek - 1]);
return dayNames[dayOfWeek - 1];

}

/**
* 获得日期的下一个星期一的日期
*
* @param date
* @return
*/
public Calendar getNextMonday(Calendar date) {
Calendar result = null;
result = date;
do {
result = (Calendar) result.clone();
result.add(Calendar.DATE, 1);
} while (result.get(Calendar.DAY_OF_WEEK) != 2);
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: