由于我要计算一个合同在当月的分摊的金额,所以就要知道这个合同的有效期在本月有多少天,这就要进行两个时间段重合天数的计算。
两个时间段四个时间点,相当于时间轴上的两条线段(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 判断两个时间段是否重叠的案例.docx
有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家。 例如求(2022-05-02 00:00:00 至 2022-05-12 23:59:59) 时间段和(2022-05-04 ...
计算两张图像的重合率,如果有一个标准数据集,一个程序计算的数据集,计算两个数据集的准确率、召回率及F1-measure;将两个图像进行点乘,重叠区域面积S,标准数据集面积S1,程序计算得到的数据集面积S2,则召回率=...
java处理日期合并
主要介绍了Python 实现两个矩形重合面积代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
写一个C++程序,计算两个多边形的重叠面积 多边形class定义如下: class Polygon { public: Polygon(float* polygon, int vertex) : polygon(polygon), vertex(vertex) {}; private: float* polygon; // 坐标形式...
自动重合闸动作时间的整定原则 (1)单侧电源所采用的三相重合闸时间,除应大于故障点熄弧时间及周围介质去游离的时间外,还应大于断路器及操动机构复归原状准备好再次动作的时间。 (2)双侧电源线路的自动重合闸...
主要介绍了PHP编程计算两个时间段是否有交集的实现方法,结合具体实例形式对比分析了php时间段的转换、比较等相关操作技巧,需要的朋友可以参考下
计算两个矩形之间的IOU面积和重叠率
重合指数学过密码学的人都知道计算他的重要性,python实现又快又好
求解任意两个多边形的并集,交集,差集,要求是简单多边形,可以是凸多边形和凹多边形
现在你的任务是:给定两个满足上述要求的椭圆,计算相交面积。 输入 输入包括多个测试用例。第一行为测试用例个数n(n)。 在每一个测试用例包含两行,第一行A的描述轨迹,另一行描述B的轨迹,每一个描述包含两...
今天小编就为大家分享一篇python计算两个矩形框重合百分比的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
简单计算矩形的重叠率,通过提供俩矩形对角线的俩个点的坐标来计算。适合重叠区域也为矩形的,其中重叠率的计算与通常计算不同。
该范例主要是通过iObjects java实现批量去除面数据集中面对象的重叠部分。
python画图出图计算图形重合面积
C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)
C++根据计算几何算法,充分考虑矩形重叠的各种情况,可以准确计算矩形的重叠率