`
yuanyuan7891
  • 浏览: 167010 次
  • 性别: Icon_minigender_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 判断两个时间段是否重叠的案例.docx

    "java 判断两个时间段是否重叠的案例" 本文主要介绍了如何在 Java 中判断两个时间段是否重叠的案例。时间段是指具有起始时间和终止时间的时间范围,在实际开发中,我们经常需要判断两个时间段是否存在重叠的情况。...

    计算两时间段的重合天/小时/分钟/秒数的工具类

    有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家。 例如求(2022-05-02 00:00:00 至 2022-05-12 23:59:59) 时间段和(2022-05-04 ...

    java 判断两个时间段是否重叠的案例

    Java 判断两个时间段是否重叠的案例 在 Java 中,判断两个时间段是否重叠是一种常见的需求,特别是在业务逻辑中需要检查时间段的交叉情况时。在本文中,我们将介绍如何使用 Java 判断两个时间段是否重叠,并提供...

    java处理日期合并

    - 如果当前时间段的开始时间大于栈顶的结束时间,则说明这两个时间段没有重叠,此时将当前时间段的开始时间和结束时间入栈。 - 如果当前时间段的结束时间大于等于栈顶的结束时间,则说明有部分重叠,更新栈顶的结束...

    计算重合图像的面积

    本文将详细介绍如何计算两张图像的重合率,并基于这些指标来评估算法的有效性。 #### 1. 概念理解 - **重合率**:指两张图像之间重叠部分的面积占总面积的比例。 - **准确率**(Precision):即精确率,表示检测出...

    计算两个矩形之间的IOU面积和重叠率

    本项目聚焦于计算两个矩形之间的IOU面积和重叠率,这对于理解算法如何判断物体的检测精度至关重要。 首先,我们需要了解IOU的基本概念。IOU是两个矩形交集面积与并集面积的比值,公式可表示为: \[ IOU = \frac{...

    Python计算两个矩形重合面积代码实例

    下面将详细介绍如何使用Python计算两个矩形的重合面积,并解释相应的代码实例。 ### Python计算两个矩形重合面积代码实例知识点 #### 1. 矩形坐标表示 首先,我们需要明确矩形在平面几何中的表示方法。通常情况下...

    PHP编程计算两个时间段是否有交集的实现方法(不算边界重叠)

    在PHP编程中,计算两个时间段是否有交集是一个常见的任务,特别是在处理日程安排、时间管理或者事件冲突检测等问题时。本文将深入探讨如何实现这个功能,同时考虑不包含边界重叠的情况。 首先,我们来看一个优化前...

    计算两个多边形的重叠面积(C++)

    写一个C++程序,计算两个多边形的重叠面积 多边形class定义如下: class Polygon { public: Polygon(float* polygon, int vertex) : polygon(polygon), vertex(vertex) {}; private: float* polygon; // 坐标形式...

    计算两个圆相交的交点坐标值

    在GIS(地理信息系统)领域,计算两个圆的相交交点是常见的空间分析任务,尤其在地图绘制和地理数据处理中。本范例利用SuperMap的iObject和Java技术,结合GIS理论,来解决这个问题。这里我们将深入探讨如何实现这个...

    python计算两个矩形框重合百分比的实例

    在Python编程中,有时我们需要处理图像处理或者计算机视觉任务,其中计算两个矩形框的重合程度是一项常见的操作。这个实例展示了如何用Python计算两个矩形框的重合百分比,这对于理解对象检测、图像分割等领域是很有...

    两个多边形的并交差

    本话题主要探讨如何计算两个简单多边形(可以是凸多边形或凹多边形)的并集、交集和差集。 首先,我们要明确几个基本概念: 1. **简单多边形**:一个多边形不自相交,即它的边不交叉。简单多边形可以是凸的或凹的。...

    自动重合闸动作时间原则自动重合闸动作时限的选择原则

    自动重合闸动作时间的整定原则 (1)单侧电源所采用的三相重合闸时间,除应大于故障点熄弧时间及周围介质去游离的时间外,还应大于断路器及操动机构复归原状准备好再次动作的时间。 (2)双侧电源线路的自动重合闸...

    C++语言实现一些基本算法(两点距离、点是否在直线上、点与直线的关系、两直线的夹角、两直线的交点、两个举行的重合面积等等)

    本主题主要关注在二维空间中处理几何问题的一些基本算法,如计算两点之间的距离、判断点是否在直线上、确定点与直线的关系、求解两直线的夹角和交点,以及计算两个矩形的重合面积。以下将详细阐述这些算法的实现原理...

    java音轨合成,安卓音频合成

    要实现这个项目,你可以参考开源库,如JAVE(Java Audio Video Encoder)或者研究Java Sound API的相关教程。同时,了解安卓多媒体处理的最佳实践也非常重要。 总结,"java音轨合成,安卓音频合成"涉及到Java音频...

    C++简单矩形重叠率的计算

    在计算机科学中,特别是在图形学和几何算法领域,计算两个矩形的重叠率是一项基本任务。本主题聚焦于使用C++实现一个简单的矩形重叠率计算方法,特别是针对那些重叠部分仍为矩形的情况。重叠率是衡量两个几何形状...

    两圆求交点算法实现Java代码

    在计算机图形学、游戏开发或几何计算中,求解两圆交点的算法是一个常见的问题。这个算法在Java中实现,对于处理图形碰撞检测、绘制交互式图形等场景至关重要。以下将详细介绍如何实现这个算法以及相关知识。 首先,...

    求两个椭圆相交的面积问题

    现在你的任务是:给定两个满足上述要求的椭圆,计算相交面积。 输入 输入包括多个测试用例。第一行为测试用例个数n(n)。 在每一个测试用例包含两行,第一行A的描述轨迹,另一行描述B的轨迹,每一个描述包含两...

Global site tag (gtag.js) - Google Analytics