1. 程式人生 > >java計算兩個時間段的重合天數

java計算兩個時間段的重合天數

由於我要計算一個合同在當月的分攤的金額,所以就要知道這個合同的有效期在本月有多少天,這就要進行兩個時間段重合天數的計算。

兩個時間段四個時間點,相當於時間軸上的兩條線段(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));
	}
}


相關推薦

java計算時間段重合天數

由於我要計算一個合同在當月的分攤的金額,所以就要知道這個合同的有效期在本月有多少天,這就要進行兩個時間段重合天數的計算。 兩個時間段四個時間點,相當於時間軸上的兩條線段(b代表起點,e代表端點,b<=e)和4個端點。 可分3種情況:1.不相交。(b1-----e1)【

java計算時間段的精確天數

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date d1=sdf.parse

java 計算日期之間天數

 import java.text.ParseException; import java.text.SimpleDateFormat; /** * @author JavaAlpha * @

Java 計算日期相差年數字、月數、天數及時分秒

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import org.apache.log4j.Logger;

Java 計算日期相差的天數

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class test16 { /**

JAVA-計算日期之間相差的天數

/**      * 計算兩個日期之間相差的天數      * @param date1      * @param date2      * @return      */     public static int daysBetween(Date date1,Date

java實現計算日期相差天數

要求:計算1999年1月1日和2018年11月3日相差多少天 思路: 1、每年的天數累加,需判斷閏年、平年 2、每月的天數累加,不同月份天數不同,平年和閏年,2月份的天數也不同 3、將日期天數累加 (因為計算的是相差的天數,所以這個天數需要減1天,所以這裡加2就可以了) packag

Java 計算日期相差月數、天數

public static final int daysBetween(Date early, Date late) { java.util.Calendar calst = java.util.Calendar.getInstance(); jav

java計算日期相差的天數

/** * 計算兩個日期相差的天數 * @param oldDate * @param newDate * @return * @author

java計算日期之前的天數(工作日),排除節假日和週末

如題所說,計算兩個日期之前的天數,排除節假日和週末。這裡天數的型別為double,因為該功能實現的是請假天數的計算,有請一上午假的為0.5天。 不夠很坑的是每個日期都要查詢資料庫,感覺很浪費時間。

Java計算日期之間的天數

package exercise; import java.util.Scanner; public class PerCalender { public static void main(String[] args) { //輸入初始日期 Scanner s

Java計算日期時間之間的天數-省事高階

有一種low的方式,就是你把兩個時間都換成秒,然後除以一天的秒數,然後向上取整,就是算的天數。但是這麼實現太low啦。jdk有高階的API,我們為啥還要自己去實現呢,問題就是我們不知道。所以,我在這寫個筆記,記錄下,jdk 1.8 是怎麼做的。 /** * 計

php 計算日期相差天數

class end rto date 日期相差 天數 day sharp echo php 計算兩個日期相差天數 <?php $startdate=strtotime("2013-3-09"); $enddate=strtotime("2013-

MYSQL如何計算日期間隔天數

如何透過MYSQL自帶函式計算給定的兩個日期的間隔天數 有兩個途徑可獲得 1、利用TO_DAYS函式 select to_days(now()) - to_days('20120512') 2、利用DATEDIFF函式 select datediff(now(),'201205

Java計算日期之間的天數

public static int daysBetween(String early, String late){ Date earlydate = new Date();            Date latedate = n

js計算日期的天數差值

函數 ber parseint pre days var 毫秒 cti param js計算兩個日期的天數差值 通過兩個日期計算這兩個日期之間的天數差值 /** * 計算天數差的函數,通用 * @param sDate1 * @param sDate2 * @ret

Java計算日期時間相差幾天,幾小時,幾分鐘等

目錄 方法一: 方法二: 方法三: java 比較時間大小 現在是2004-03-26 13:31:40 過去是:2004-01-02 11:30:24 要獲得兩個日期差,差的形式為:XX天XX小時XX分XX秒 方法一: DateFormat df = new Si

java計算日期相差多少天

在控制檯上輸入兩個精確到年,月,日的時間。 計算兩個日期之間相差了多少天,並顯示在控制檯上 package com.neuedu.homework; import java.util.Calendar; import java.util.Scanner; import sun.uti

Java 計算Data物件的時間差

需求原因:        有時候需要計算兩個Date物件的時間差來定時處理某種事務,獲取到的時間差可以是分鐘差,秒差,毫秒等等,相互轉化即可 package io.bbc13.util; impo

面試:解決重點問題,計算時間段是否有交集的演算法及其應用例項

1、通過 if 判斷語句進行判斷,if(endTime1 > startTime2 && endTime2 > startTime1) 那麼這兩個時間段有交集,一個時間段的結束時間大於另一個時間段的開始時間,如果成立那麼兩個時間段有交集。