java计算两个时间区间之间的天数

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateUtil {
    /**
     * 得到指定月的天数
     * */
    public static int getDaysOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }
    /**
     *这里共有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 long 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);
        long 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=0;
           // System.out.println("意料外的日期组合,无法计算重合天数!");
        }
      //  System.out.println("重合天数为["+coincidenceday+"]天。");
        return coincidenceday+1;
    }
    /**
     * 计算两个日期的相差天数(d1-d2)
     * @param d1
     * @param d2
     * @return
     */
    public static long getDayDifference(Date d1,Date d2){

            long num = (d1.getTime()-d2.getTime())/1000;
            long days  = num/(3600*24);
            if(days<0)days=days*-1;
        return days;
    }

    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;
    }





}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值