【代碼實現】:兩個日期之間的工作日時間差(精確到毫秒)
【代碼特點】:
1.支持跨年。
2.獲取的是精確到毫秒的時間差。
3.國家法定假日未計算在內(像陰曆這種的只有通過加入LIST的方法了=。=)。
- package com.wednesday.tools.timetools;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- public class GetWorkDayTimeMillisecond {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- GetWorkDayTimeMillisecond a = new GetWorkDayTimeMillisecond();
- Long b=a.getWorkdayTimeInMillis("2010-05-17 8-00-00", "2010-05-18 9-00-00", "yyyy-MM-dd HH-mm-ss");
- System.out.println(b);
- }
- /**
- * 獲取兩個時間之內的工作日時間(只去掉兩個日期之間的週末時間,法定節假日未去掉)
- * @param start -起始時間,共有3個重載方法,可以傳入long型,Long型,與Date型
- * @param end -結束時間,共有3個重載方法,可以傳入long型,Long型,與Date型
- * @return Long型時間差對象
- */
- public Long getWorkdayTimeInMillis(long start, long end){
- //如果起始時間大於結束時間,將二者交換
- if(start>end){
- long temp = start;
- start = end;
- end = temp;
- }
- //根據參數獲取起始時間與結束時間的日曆類型對象
- Calendar sdate = Calendar.getInstance();
- Calendar edate = Calendar.getInstance();
- sdate.setTimeInMillis(start);
- edate.setTimeInMillis(end);
- //如果兩個時間在同一周並且都不是週末日期,則直接返回時間差,增加執行效率
- if(sdate.get(Calendar.YEAR)==edate.get(Calendar.YEAR)
- && sdate.get(Calendar.WEEK_OF_YEAR)==edate.get(Calendar.WEEK_OF_YEAR)
- && sdate.get(Calendar.DAY_OF_WEEK)!=1 && sdate.get(Calendar.DAY_OF_WEEK)!=7
- && edate.get(Calendar.DAY_OF_WEEK)!=1 && edate.get(Calendar.DAY_OF_WEEK)!=7){
- return new Long(end-start);
- }
- //首先取得起始日期與結束日期的下個週一的日期
- Calendar snextM = getNextMonday(sdate);
- Calendar enextM = getNextMonday(edate);
- //獲取這兩個週一之間的實際天數
- int days = getDaysBetween(snextM, enextM);
- //獲取這兩個週一之間的工作日數(兩個週一之間的天數肯定能被7整除,並且工作日數量佔其中的5/7)
- int workdays = days/7*5;
- //獲取開始時間的偏移量
- long scharge = 0;
- if(sdate.get(Calendar.DAY_OF_WEEK)!=1 && sdate.get(Calendar.DAY_OF_WEEK)!=7){
- //只有在開始時間爲非週末的時候才計算偏移量
- scharge += (7-sdate.get(Calendar.DAY_OF_WEEK))*24*3600000;
- scharge -= sdate.get(Calendar.HOUR_OF_DAY)*3600000;
- scharge -= sdate.get(Calendar.MINUTE)*60000;
- scharge -= sdate.get(Calendar.SECOND)*1000;
- scharge -= sdate.get(Calendar.MILLISECOND);
- }
- //獲取結束時間的偏移量
- long echarge = 0;
- if(edate.get(Calendar.DAY_OF_WEEK)!=1 && edate.get(Calendar.DAY_OF_WEEK)!=7){
- //只有在結束時間爲非週末的時候才計算偏移量
- echarge += (7-edate.get(Calendar.DAY_OF_WEEK))*24*3600000;
- echarge -= edate.get(Calendar.HOUR_OF_DAY)*3600000;
- echarge -= edate.get(Calendar.MINUTE)*60000;
- echarge -= edate.get(Calendar.SECOND)*1000;
- echarge -= edate.get(Calendar.MILLISECOND);
- }
- //計算最終結果,具體爲:workdays加上開始時間的時間偏移量,減去結束時間的時間偏移量
- return workdays*24*3600000+scharge-echarge;
- }
- public Long getWorkdayTimeInMillis(Long start, Long end){
- return getWorkdayTimeInMillis(start.longValue(), end.longValue());
- }
- public Long getWorkdayTimeInMillis(Date start, Date end){
- return getWorkdayTimeInMillis(start.getTime(), end.getTime());
- }
- 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 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;
- }
- /**
- * 獲取兩個日期之間的實際天數,支持跨年
- */
- 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;
- }
- }