【代碼實現】:兩個日期之間的工作日時間差(精確到毫秒)
【代碼特點】:
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; } }
作爲Java程序員來說,最痛苦的事情莫過於可以選擇的範圍太廣,可以讀的書太多,往往容易無所適從。我想就我自己讀過的技術書籍中挑選出來一些,按照學習的先後順序,推薦給大家,特別是那些想不斷提高自己技術水平的Java程序員們。 在這
1.接收HTTP響應結果(獲得字節流,需要轉換爲字符串): (1)read方法返回-1代表結束 此方法佔用內存大,用來接收網頁不適合 InputStream socketIn=socket.getInputStream();
1.今天剛學習使用處理XML的一種方式 //初始化 XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factor