/***
* 验证结束日期是否合法,如果不合法,并返回修复后的正确日期毫秒数
*
@param sdate
* @return
*/
private long validateEndTime(Calendar edate)
{
if(edate.get(Calendar.DAY_OF_WEEK) == 1)//结束日期是周日,如果结束日期是周六、周末自动修复为这周五18:00
{
edate.add(Calendar.DATE,-2);
edate.setTimeInMillis(
edate.getTime().getTime()+
(
18*3600000-(
(edate.get(Calendar.HOUR_OF_DAY) * 3600000)
+ (edate.get(Calendar.MINUTE) * 60000)
+ (edate.get(Calendar.SECOND) * 1000)
)
)
);
}else if(edate.get(Calendar.DAY_OF_WEEK) == 7)//结束日期是周六,如果结束日期是周六、周末自动修复为这周五18:00
{
edate.add(Calendar.DATE,-1);
edate.setTimeInMillis(
edate.getTime().getTime()+
(
18*3600000-(
(edate.get(Calendar.HOUR_OF_DAY) * 3600000)
+ (edate.get(Calendar.MINUTE) * 60000)
+ (edate.get(Calendar.SECOND) * 1000)
)
)
);
}
return edate.getTimeInMillis();
}
/***
* 计算两个日期间的工作日天数,除周六日
*
* @param sdate
* @param edate
* @return
*/
private long calcWorkdayTimeInMillis(Calendar sdate, Calendar edate,
long start, long end) {
// 获取开始时间的偏移量
long scharge = 0;
if (sdate.get(Calendar.DAY_OF_WEEK) != 1
&& sdate.get(Calendar.DAY_OF_WEEK) != 7) {
// 只有在开始时间为非周末的时候才计算偏移量
scharge += (sdate.get(Calendar.HOUR_OF_DAY) * 3600000);
scharge += (sdate.get(Calendar.MINUTE) * 60000);
scharge += (sdate.get(Calendar.SECOND) * 1000);
scharge = ((24 * 3600000) - scharge);
scharge += ((sdate.getTime().getTime() - start) - (3 * 24 * 3600000));
}
// (24*3600000=86400000)-((9*3600000+1800000)=34200000)+(3*24*3600000=259200000)-(2*24*3600000)=
// 86400000-34200000=52200000
// 获取结束时间的偏移量
long echarge = 0;
if (edate.get(Calendar.DAY_OF_WEEK) != 1
&& edate.get(Calendar.DAY_OF_WEEK) != (7)) {
// 只有在结束时间为非周末的时候才计算偏移量
echarge += (edate.get(Calendar.HOUR_OF_DAY) * 3600000);
echarge += (edate.get(Calendar.MINUTE) * 60000);
echarge += (edate.get(Calendar.SECOND) * 1000);
echarge = ((24 * 3600000) - echarge);
echarge += (edate.getTime().getTime() - end) - (24 * 3600000);
echarge -= (2 * 24 * 3600000);
}
// (24*3600000=86400000)-(18*3600000=64800000)+(24*3=259200000)
if (scharge < 0 || echarge < 0)
scharge = echarge = 0;
return scharge - echarge;
}
/**
* 获取两个时间之内的工作日时间(只去掉两个日期之间的周末时间,法定节假日未去掉)
*
* @param start
* -起始时间,共有3个重载方法,可以传入long型,Long型,与Date型
* @param end
* -结束时间,共有3个重载方法,可以传入long型,Long型,与Date型
* @return Long型时间差对象
*/
public Long getWorkdayTimeInMillisExcWeekend(long start, long end) {
return getWorkdayTimeInMillis(start, end);
}
/***
* 获取两个时间之内的工作日时间(去掉两个日期之间的周末时间,法定节假日时间)
*
* @param start
* @param end
* @return
*/
public Long getWorkdayTimeInMillisExcWeekendHolidays(String start,
String end, String format, List<Date> listHolidays) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date sdate;
Date edate;
try {
sdate = sdf.parse(start);
edate = sdf.parse(end);
return getWorkdayTimeInMillis(sdate.getTime(), edate.getTime(),
listHolidays);
} catch (ParseException e) {
e.printStackTrace();
return new Long(0);
}
}
public Long getWorkdayTimeInMillis(Long start, Long end) {
return getWorkdayTimeInMillis(start.longValue(), end.longValue(), null);
}
public Long getWorkdayTimeInMillis(Date start, Date end) {
return getWorkdayTimeInMillis(start.getTime(), end.getTime(), null);
}
public Long getWorkdayTimeInMillis(String start, String end, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date sdate;
Date edate;
try {
sdate = sdf.parse(start);
edate = sdf.parse(end);
return getWorkdayTimeInMillis(sdate, edate);
} catch (ParseException e) {
e.printStackTrace();
return new Long(0);
}
}
private long getHolidaysInMillis(long start, long end,
List<Date> listHolidays) {
Calendar scalendar = Calendar.getInstance();
Calendar ecalendar = Calendar.getInstance();
int daysofH = 0;
try {
scalendar.setTimeInMillis(start);
ecalendar.setTimeInMillis(end);
if (listHolidays == null)
return new Long(0);
Iterator<Date> iterator = listHolidays.iterator();
while (iterator.hasNext()) {
Calendar ca = Calendar.getInstance();
Date hdate = iterator.next();
ca.setTime(hdate);
if (ca.after(scalendar) && ca.before(ecalendar)) {
daysofH = daysofH + 1;
} else if (ca.getTimeInMillis() == scalendar.getTimeInMillis()) {
daysofH = daysofH + 1;
} else if (ca.getTimeInMillis() == ecalendar.getTimeInMillis()) {
daysofH = daysofH + 1;
}
}
} catch (Exception e) {
e.printStackTrace();
return new Long(0);
}
return daysofH * 24 * 3600000;
}
private Calendar getNextMonday(Calendar cal) {
int addnum = 9 - cal.get(Calendar.DAY_OF_WEEK);
if (addnum == 8)
addnum = 1;// 周日的情况
cal.add(Calendar.DATE, addnum);
return cal;
}
/**
*
* @param 要转换的毫秒数
* @return 该毫秒数转换为 * days * hours * minutes * seconds 后的格式
*/
public String formatDuring(long mss) {
long days = mss / (1000 * 60 * 60 * 24);
long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
long seconds = (mss % (1000 * 60)) / 1000;
return days + " days " + hours + " hours " + minutes + " minutes "
+ seconds + " seconds ";
}
/**
* 获取两个日期之间的实际天数,支持跨年
*/
public int getDaysBetween(Calendar start, Calendar end) {
if (start.after(end)) {
Calendar swap = start;
start = end;
end = swap;
}
int days = end.get(Calendar.DAY_OF_YEAR)
- start.get(Calendar.DAY_OF_YEAR);
int y2 = end.get(Calendar.YEAR);
if (start.get(Calendar.YEAR) != y2) {
start = (Calendar) start.clone();
do {
days += start.getActualMaximum(Calendar.DAY_OF_YEAR);
start.add(Calendar.YEAR, 1);
} while (start.get(Calendar.YEAR) != y2);
}
return days;
}
}