package com.xiawei.repeatdays;
import java.util.Date;
/**
* 判断日期之间关系(相交,相离,重合),得到相交重合的天数
*
*/
public class RepeatDays {
/**
* 将两个日期相减的结果以字符串秒的格式返回
*/
public static String getDayDifference(Date d1 , Date d2){
StringBuffer ds = new StringBuffer();
long days = ((d1.getTime() - d2.getTime())/1000)/(3600*24);
if(days >= 0){
ds.append(days);
}
return ds.toString();
}
/**
* 计算两个日期区间重合的天数
* @param startDate1 第一个开始日期
* @param endDate1 第一个结束日期
* @param startDate2 第二个开始日期
* @param endDate2 第二个结束日期
* @return 日期区间重合的天数
*/
public static int getRepeatDays(Date startDate1,Date endDate1,Date startDate2,Date endDate2){
//将日期类型转换为数值以秒为单位
long star1 = startDate1.getTime();
long end1 = endDate1.getTime();
long star2 = startDate2.getTime();
long end2 = endDate2.getTime();
String coincidenceday;
//这里有一个小知识点,就是assert关键字.他在C++也有,表示断言.java在执行的时候是不开启断言检查的
//它有两种用法:
//1.assert<bollean表达式>;
// --如果为true程序继续执行,false则抛出AssertionError,并终止执行
//2.assert<bollean表达式>:<错误信息表达式>.
// --如果为true程序继续执行,false则抛出java.lang.AssertionError,并输入错误信息表达式
assert(star1<end1 && star2<end2);
if(star1<=star2 && end1 >= end2){
coincidenceday = getDayDifference(endDate2,startDate2);
}else if(star1>=star2 && end1 <= end2){
coincidenceday = getDayDifference(endDate1,startDate1);
}else if(star1>=star2 && star1<=end2 && end2 <= end1){
coincidenceday = getDayDifference(endDate2,startDate1);
}else if(star1 <= star2 && end1 <= end2 && end1 >= star2){
coincidenceday = getDayDifference(endDate1,startDate2);
}else if(end1 <= star2 && star1 >= end2){
coincidenceday = "0";
}else {
coincidenceday = "0";
}
//
int numberDays = Integer.parseInt(coincidenceday);
return numberDays;
}
/**
* 计算两个日期间相隔的天数
* @param endDate 结束日期
* @param startDate 开始日期
* @return 两个日期间相隔的天数
*/
public static int getRepeatDaysTwo(Date endDate,Date startDate){
long star = startDate.getTime();
long end = endDate.getTime();
if(end < star){
System.err.println("请用较晚的日期减去较早的日期!");
}else{
String coincidenceday = getDayDifference(endDate,startDate);
int numberDays = Integer.parseInt(coincidenceday);
//返回天数
return numberDays;
}
return 0;
}
}