由於我要計算一個合約在當月的分攤的金額,所以就要知道這個合約的有效期間在本月有多少天,這就要進行兩個時間段重合天數的計算。
兩個時間段四個時間點,相當於時間軸上的兩條線段(b代表起點,e代表端點,b<=e)和4個端點。
可分3種情況:
1.不相交。(b1-----e1)【b2-----e2】(b1-----e1)。if(e1<b2||b1>e2)此時,重合天數為零。
2.相交。
情況一:(b1---【b2---e1)----e2】 if(b1<b2&&e1<e2&&e1>b2)
情況二:【b2---(b1---e2】----e1) if(b1>b2&&b1<e2&&e2<e1)
3.包含:計算較短的時間段日期長度。
(b1---【b2-----e2】--e1) if(b1<b2&&e1>e2)
【b2---(b1-----e1)--e2】 if(b1>b2&&e1<e2)
import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;/** * @author skysnow * */public class myDateUtil {/** *這裡共有2個時間段(b1-----e1)【b2-----e2】,4個時間點; *相當於兩條線段(b代表起點,e代表端點,b<=e),4個端點。 *可分3種情況: *1.不相交。(b1-----e1)【b2-----e2】(b1-----e1)。if(e1<b2||b1>e2)此時,重合天數為零。 *2.相交。 *情況一:(b1---【b2---e1)----e2】 if(b1<b2&&e1<e2&&e1>b2) *情況二:【b2---(b1---e2】----e1) if(b1>b2&&b1<e2&&e2<e1) *3.包含:計算較短的時間段日期長度。 *(b1---【b2-----e2】--e1) if(b1<b2&&e1>e2) *【b2---(b1-----e1)--e2】 if(b1>b2&&e1<e2) * @param begindate1 開始日期 * @param enddate1 結束日期 * @param begindate2開始日期 * @param enddate2 結束日期 * @return */public static String getDayCoincidence(Date begindate1,Date enddate1,Date begindate2,Date enddate2){long b1=begindate1.getTime();long e1=enddate1.getTime();long b2=begindate2.getTime();long e2=enddate2.getTime();assert(b1<e1&&b2<e2);String coincidenceday;if(b1<=b2&&e1>=e2){//(b1---【b2-----e2】--e1)System.out.println("1包含2");coincidenceday=getDayDifference(enddate2,begindate2);}else if(b1>=b2&&e1<=e2){//【b2---(b1-----e1)--e2】System.out.println("2包含1");coincidenceday=getDayDifference(enddate1,begindate1);}else if(b1>=b2&&b1<=e2&&e2<=e1){//【b2---(b1---e2】----e1)System.out.println("相交");coincidenceday=getDayDifference(enddate2,begindate1);}else if(b1<=b2&&e1<=e2&&e1>=b2){//(b1---【b2---e1)----e2】System.out.println("相交");coincidenceday=getDayDifference(enddate1,begindate2);}else if(e1<=b2||b1>=e2){coincidenceday="0";}else{coincidenceday="";System.out.println("意料外的日期組合,無法計算重合天數!");}System.out.println("重合天數為["+coincidenceday+"]天。");return coincidenceday;}/** * 計算兩個日期的相差天數(d1-d2) * @param d1 * @param d2 * @return */public static String getDayDifference(Date d1,Date d2){StringBuffer ds = new StringBuffer();try{long num = (d1.getTime()-d2.getTime())/1000;long days = num/(3600*24);if(days>=0)ds.append(days);}catch(Exception e){ds=new StringBuffer("");e.printStackTrace();}return ds.toString();} public static Date stringToDate(String strDate) { if (strDate==null){return null;} SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); ParsePosition pos = new ParsePosition(0); Date strtodate = formatter.parse(strDate, pos); return strtodate; } public static String getThisMonth(){// 本月的第一天 Calendar calendar = new GregorianCalendar();calendar.set(Calendar.DATE, 1);SimpleDateFormat simpleFormate = new SimpleDateFormat("yyyy-MM-dd");String fd = simpleFormate.format(calendar.getTime()); // 本月的最後一天 calendar.set( Calendar.DATE, 1 );calendar.roll(Calendar.DATE, - 1 );String ld = simpleFormate.format(calendar.getTime());return fd+","+ld;}public static void main(String[] args) {String[] thisMonth=getThisMonth().split(",");Date begindate1 = stringToDate(thisMonth[0]+" 00:05:00");Date enddate1 = stringToDate(thisMonth[0]+" 24:05:00");;Date begindate2 = stringToDate(thisMonth[0]+" 00:05:00");Date enddate2 = stringToDate(thisMonth[1]+" 00:00:00");System.out.println(getDayCoincidence(begindate1, enddate1, begindate2, enddate2));}}