日期计算

       /**      * 自然月拆分      * @param beginDate  开始时间      * @return      * beginDate 开始时间      * endDate   本月结束时间      * preDate   下月开始时间      * dateNum   开始及结束时间之间的天数      * mothNum   当月天数      */     public static ExtendMap<String, Object> naturalMonthSplit(Date beginDate){         Date    preDate = DateUtils.ceiling(beginDate, Calendar.MARCH) ;  // 2018-04-01         Date    endDate = DateUtils.addDays(preDate, -1)  ; // 2018-03-31         long dateNum = DataTimeUtils.differentDate("DAY", beginDate, endDate)+ 1  ;          //26         long mothNum = DataTimeUtils.differentDate("DAY", getPreMonthDate(beginDate), endDate)+1  ;           //31         ExtendMap<String, Object> returnMap = new ExtendMap<>();         returnMap.put("beginDate",beginDate);         returnMap.put("endDate",endDate);         returnMap.put("preDate", preDate);         returnMap.put("dateNum", dateNum);         returnMap.put("mothNum", mothNum);         return returnMap ;     }     /**      * 自然月拆分      * 获取开始时间到结束时间中每个月的时间及天数      * @param beginDate 开始时间      * @param endDate   结束时间      * @return      */     public static List<ExtendMap<String, Object>> naturalMonthSplit(Date beginDate , Date endDate){         List<ExtendMap<String, Object>>  returnList = new  ArrayList<>();         long num = DataTimeUtils.differentDate("M", beginDate, endDate);         for(long  i=0; i<=num ; i++) {             ExtendMap<String, Object> map = new ExtendMap<>();             map = naturalMonthSplit(beginDate);             if(i == num){                 map.put("endDate", endDate);                 map.put("dateNum", DataTimeUtils.differentDate("D", (Date) map.get("beginDate"), endDate)+1);             }             returnList.add(map);             beginDate = (Date) map.get("preDate");         }         return returnList ;     }         /**      * 合同月拆分      * @param beginDate      * @return      */     public static ExtendMap<String, Object> contractMonthSplit(Date beginDate) {         ExtendMap<String, Object> map = new ExtendMap<>();         Calendar cal1 = Calendar.getInstance();         cal1.setTime(beginDate);         int day = cal1.get(Calendar.DAY_OF_MONTH);         Date afterDate;         if(day > 27 ) {             Date endDate = DateUtils.addMonths(beginDate, 1);              Date beginDateTemp =DateUtils.addDays(getPreMonthDate(endDate),-1) ;             int dayEndNum = (int) DataTimeUtils.differentDate("D", beginDate, beginDateTemp) + 1 ;             afterDate= DateUtils.addDays(getEndMonthDate(endDate), -dayEndNum);             map.put("beginDate", beginDate);             map.put("endDate", afterDate);         }else {             afterDate = DateUtils.addDays( DateUtils.addMonths(beginDate, 1),-1);              map.put("beginDate", beginDate);             map.put("endDate", afterDate);         }         long dateNum = DataTimeUtils.differentDate("DAY", beginDate, afterDate)+ 1  ;            //26         long mothNum = DataTimeUtils.differentDate("DAY", beginDate, afterDate)+ 1  ;         map.put("dateNum", dateNum);         map.put("mothNum", mothNum);         return map ;     }         /**      * 合同月拆分      * @param beginDate      * @param endDate      * @return      */     public static  List<ExtendMap<String, Object>> contractMonthSplit(Date beginDate , Date endDate) {         List<ExtendMap<String, Object>>  returnList = new  ArrayList<>();         long num = DataTimeUtils.differentDate("M", beginDate, endDate);         Date tempDate = beginDate ;         for(int i=0;i<num;i++) {             ExtendMap<String, Object> map  =contractMonthSplit(tempDate);             tempDate = (Date) map.get("endDate");             tempDate = DateUtils.addDays(tempDate, 1);             if(i == num){                 map.put("endDate", endDate);                 map.put("dateNum", DataTimeUtils.differentDate("D", (Date) map.get("beginDate"), endDate)+1);             }             returnList.add(map);         }         return returnList ;     }              /**      * 日期拆分调用      * @param beginDate      * @param endDate      * @param type      * @return      */     public static  List<ExtendMap<String, Object>> dateSplit(Date beginDate , Date endDate , Long type ) {         if(type == 1) {             return naturalMonthSplit(beginDate, endDate);         }else{             return contractMonthSplit(beginDate, endDate);         }     }               /**      * 计算开始日期到结束日期之间月数      * @param begDate  开始日期      * @param endDate  结束日期      * @return      */     public static BigDecimal calculationAmount(Date begDate,Date endDate) {         Calendar cal1 = Calendar.getInstance();          cal1.setTime(begDate);         cal1.add(Calendar.MONTH, 1);          cal1.set(Calendar.DAY_OF_MONTH, cal1.getActualMinimum(Calendar.DAY_OF_MONTH));           Date preMonth =cal1.getTime(); //开始日期的下一个月         Calendar cal2 = Calendar.getInstance();          cal2.setTime(endDate);          cal2.add(Calendar.MONTH, -1);          cal2.set(Calendar.DAY_OF_MONTH, cal2.getActualMaximum(Calendar.DAY_OF_MONTH));         Date lastMonth = cal2.getTime(); //结束日期的上一个月         long midValue = 0;//开始日期的下一个月和结束日期的上一个月之间有多少月         if(preMonth.before(lastMonth)) {             midValue = DataTimeUtils.differentDate("M", preMonth, lastMonth)+1;         }         long begDateNum = DataTimeUtils.differentDate("D", begDate, getEndMonthDate(begDate))+1;//开始日期到当前月底的的天数         long begMouthNum = getCurrentMonthDay(begDate);//开始日期当前月有多少天         BigDecimal begValue = new BigDecimal(begDateNum).divide(new BigDecimal(begMouthNum),6,BigDecimal.ROUND_HALF_UP);         long endDateNum = DataTimeUtils.differentDate("D", getPreMonthDate(endDate),endDate)+1;//结束日期当月的第一天到结束日期的天数         long endMouthNum = getCurrentMonthDay(endDate);//结束日期当前月有多少天         BigDecimal endValue = new BigDecimal(endDateNum).divide(new BigDecimal(endMouthNum),6,BigDecimal.ROUND_HALF_UP);         BigDecimal sumDate =begValue.add(endValue.add(new BigDecimal(midValue)));         return sumDate;     }   /**      * 判断日期是否在自然季内      */     public static int getNaturalSeason(Date begDate) {         Calendar beg = Calendar.getInstance();//设置开始日期         beg.setTime(begDate);         if((beg.get(Calendar.MONTH)+1)>0 && (beg.get(Calendar.MONTH)+1)<=3) {             return 1;         }else if((beg.get(Calendar.MONTH)+1)>=4 && (beg.get(Calendar.MONTH)+1)<=6) {             return 2;         }else if((beg.get(Calendar.MONTH)+1)>=7 && (beg.get(Calendar.MONTH)+1)<=9) {             return 3;         }else if((beg.get(Calendar.MONTH)+1)>=10 && (beg.get(Calendar.MONTH)+1)<=12) {             return 4;         }         return 0;     }          /**      * 判断日期是否在自然半年内      */     public static int getNaturalHalfYear(Date begDate) {         Calendar beg = Calendar.getInstance();//设置开始日期         beg.setTime(begDate);         if((beg.get(Calendar.MONTH)+1)>0 && (beg.get(Calendar.MONTH)+1)<=6) {             return 1;         }else if((beg.get(Calendar.MONTH)+1)>=7 && (beg.get(Calendar.MONTH)+1)<=12) {             return 2;         }         return 0;     }     /**      * 判断日期是否在自然年内      */     public static int getNaturalYear(Date begDate) {         Calendar beg = Calendar.getInstance();//设置开始日期         beg.setTime(begDate);         if((beg.get(Calendar.MONTH)+1)>0 && (beg.get(Calendar.MONTH)+1)<=12) {             return 1;         }         return 0;     }     /**      * 根据开始日期和结束日期判断在哪个时间段中      * @param nowStartTime 月租金的开始日期      * @param nowEndTime   月租金的结束日期      * @param StartTime    合同租金的开始日期      * @param endTime      合同租金的结束日期      * @return      */     public static int isEffectiveDate(Date nowStartTime,Date nowEndTime, Date StartTime, Date endTime) {                  Calendar date1 = Calendar.getInstance();//月租金的开始日期         date1.setTime(nowStartTime);                 Calendar date2 = Calendar.getInstance();// 月租金的结束日期         date2.setTime(nowEndTime);           Calendar begin = Calendar.getInstance();//合同租金的开始日期         begin.setTime(StartTime);           Calendar end = Calendar.getInstance();//合同租金的结束日期         end.setTime(endTime);                 //月租金全部包含在合同租金         if((date1.after(begin) || date1.equals(begin)) && (date2.before(end) || date2.equals(end))) {             return 1;         //免租金全部包含在月租金中         }else if((date1.before(begin) || date1.equals(begin)) && (date2.after(end) || date2.equals(end))) {             return 2;         //月租金的开始日期包含在合同租金中         }else if((date1.after(begin) || date1.equals(begin))  && date2.after(end) && date1.before(end)){             return 3;         //月租金的结束日期包含在合同租金中         }else if(date1.before(begin) && date2.before(end)  && (date2.after(begin) || date2.equals(begin))){             return 4;         }else {             return 0;         }     }              /**      * 获取任意时间的月第一天      * @param repeatDate      * @return      */      public static Date getPreMonthDate(Date repeatDate){          return DateUtils.truncate(repeatDate,Calendar.MARCH);     }              /**      * 获取任意时间的月的最后一天      * @param repeatDate      * @return     */      public static Date getEndMonthDate(Date repeatDate) {          Calendar calendar = Calendar.getInstance();          calendar.setTime(repeatDate);          calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));          return calendar.getTime();      }      /**      * 根据日期计算当月有多少天      * @param date      * @return      */     public static long getCurrentMonthDay(Date date) {          Calendar a = Calendar.getInstance();          a.setTime(date);         a.set(Calendar.DATE, 1);          a.roll(Calendar.DATE, -1);          int maxDate = a.get(Calendar.DATE);          return maxDate;      }        /**      * 判断时间格式      */     public static boolean isValidDate(String str) {          boolean convertSuccess=true;          // 指定日期格式为四位年/两位月份/两位日期,注意yyyy-MM-dd区分大小写;          SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");               try {          // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期,比如2007-02-29会被接受,并转换成2007-03-01                   format.setLenient(false);                   format.parse(str);                } catch (ParseException e) {          // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对                     convertSuccess=false;                 }                 return convertSuccess;          }       /**      * 数据的奇偶校验      *      */     public static int Number(String str) {         //先将字符转成2进制         String str1 = "";         char[] strChar = str1.toCharArray();         String result = "";         for (int i = 0; i < strChar.length; i++) {             result += Integer.toBinaryString(strChar[i]) + " ";         }         //循环找出二进制数字中1的个数         int a1 = 0;         for (int i = 0; i < result.length(); i++) {             String c = result.substring(i, i + 1);             if (c.equalsIgnoreCase("1")) {                 a1++;             }         }         int b = a1 % 2 == 0 ? 0 : 1;         return b;     }     /**      *      * @param ts MinimumGuaranteeDomain 的list      * @return  false 时间交叉  true 时间不交叉      */     public static  boolean check(List<MinimumGuaranteeDomain>  ts ) {         Collections.sort(ts, new MinimumGuaranteeDomain());         boolean flag=true;         for(int i=0; i<ts.size()-1;i++) {             MinimumGuaranteeDomain item1=ts.get(i);;             MinimumGuaranteeDomain item2=ts.get(i+1);             Date end = new Date(DataTimeUtils.getTimeLong(item1.getEnddate())*1000);             Date beg = new Date(DataTimeUtils.getTimeLong(item2.getBegdate())*1000);             if(DataTimeUtils.differentDate("D",end,beg)<0) {                 flag=false;                 break;             }                      }         return flag ;     }         
上一篇:自动计算请假工时 排除周六周日


下一篇:easyui datebox 精确到秒并且显示值