由于我要计算一个合同在当月的分摊的金额,所以就要知道这个合同的有效期在本月有多少天,这就要进行两个时间段重合天数的计算。
两个时间段四个时间点,相当于时间轴上的两条线段(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 判断两个时间段是否重叠的案例" 本文主要介绍了如何在 Java 中判断两个时间段是否重叠的案例。时间段是指具有起始时间和终止时间的时间范围,在实际开发中,我们经常需要判断两个时间段是否存在重叠的情况。...
有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家。 例如求(2022-05-02 00:00:00 至 2022-05-12 23:59:59) 时间段和(2022-05-04 ...
Java 判断两个时间段是否重叠的案例 在 Java 中,判断两个时间段是否重叠是一种常见的需求,特别是在业务逻辑中需要检查时间段的交叉情况时。在本文中,我们将介绍如何使用 Java 判断两个时间段是否重叠,并提供...
- 如果当前时间段的开始时间大于栈顶的结束时间,则说明这两个时间段没有重叠,此时将当前时间段的开始时间和结束时间入栈。 - 如果当前时间段的结束时间大于等于栈顶的结束时间,则说明有部分重叠,更新栈顶的结束...
本文将详细介绍如何计算两张图像的重合率,并基于这些指标来评估算法的有效性。 #### 1. 概念理解 - **重合率**:指两张图像之间重叠部分的面积占总面积的比例。 - **准确率**(Precision):即精确率,表示检测出...
本项目聚焦于计算两个矩形之间的IOU面积和重叠率,这对于理解算法如何判断物体的检测精度至关重要。 首先,我们需要了解IOU的基本概念。IOU是两个矩形交集面积与并集面积的比值,公式可表示为: \[ IOU = \frac{...
下面将详细介绍如何使用Python计算两个矩形的重合面积,并解释相应的代码实例。 ### Python计算两个矩形重合面积代码实例知识点 #### 1. 矩形坐标表示 首先,我们需要明确矩形在平面几何中的表示方法。通常情况下...
在PHP编程中,计算两个时间段是否有交集是一个常见的任务,特别是在处理日程安排、时间管理或者事件冲突检测等问题时。本文将深入探讨如何实现这个功能,同时考虑不包含边界重叠的情况。 首先,我们来看一个优化前...
写一个C++程序,计算两个多边形的重叠面积 多边形class定义如下: class Polygon { public: Polygon(float* polygon, int vertex) : polygon(polygon), vertex(vertex) {}; private: float* polygon; // 坐标形式...
在GIS(地理信息系统)领域,计算两个圆的相交交点是常见的空间分析任务,尤其在地图绘制和地理数据处理中。本范例利用SuperMap的iObject和Java技术,结合GIS理论,来解决这个问题。这里我们将深入探讨如何实现这个...
在Python编程中,有时我们需要处理图像处理或者计算机视觉任务,其中计算两个矩形框的重合程度是一项常见的操作。这个实例展示了如何用Python计算两个矩形框的重合百分比,这对于理解对象检测、图像分割等领域是很有...
本话题主要探讨如何计算两个简单多边形(可以是凸多边形或凹多边形)的并集、交集和差集。 首先,我们要明确几个基本概念: 1. **简单多边形**:一个多边形不自相交,即它的边不交叉。简单多边形可以是凸的或凹的。...
自动重合闸动作时间的整定原则 (1)单侧电源所采用的三相重合闸时间,除应大于故障点熄弧时间及周围介质去游离的时间外,还应大于断路器及操动机构复归原状准备好再次动作的时间。 (2)双侧电源线路的自动重合闸...
本主题主要关注在二维空间中处理几何问题的一些基本算法,如计算两点之间的距离、判断点是否在直线上、确定点与直线的关系、求解两直线的夹角和交点,以及计算两个矩形的重合面积。以下将详细阐述这些算法的实现原理...
要实现这个项目,你可以参考开源库,如JAVE(Java Audio Video Encoder)或者研究Java Sound API的相关教程。同时,了解安卓多媒体处理的最佳实践也非常重要。 总结,"java音轨合成,安卓音频合成"涉及到Java音频...
在计算机科学中,特别是在图形学和几何算法领域,计算两个矩形的重叠率是一项基本任务。本主题聚焦于使用C++实现一个简单的矩形重叠率计算方法,特别是针对那些重叠部分仍为矩形的情况。重叠率是衡量两个几何形状...
在计算机图形学、游戏开发或几何计算中,求解两圆交点的算法是一个常见的问题。这个算法在Java中实现,对于处理图形碰撞检测、绘制交互式图形等场景至关重要。以下将详细介绍如何实现这个算法以及相关知识。 首先,...
现在你的任务是:给定两个满足上述要求的椭圆,计算相交面积。 输入 输入包括多个测试用例。第一行为测试用例个数n(n)。 在每一个测试用例包含两行,第一行A的描述轨迹,另一行描述B的轨迹,每一个描述包含两...