yujian
2020-05-20 4c336b22a20b45a1e439a87f70747a96ad0e8e7b
utils/src/main/java/org/yeshi/utils/DateUtil.java
@@ -7,6 +7,8 @@
import java.util.Date;
import java.util.List;
import org.yeshi.utils.entity.DateInfo;
public class DateUtil {
   public static String dateDiff(String startTime, String endTime) {
@@ -37,7 +39,7 @@
   public static String dateDiff2(Date startTime, Date endTime) throws Exception {
      String datatime = 0 + "天" + 0 + "小时" + 0 + "分钟";
      String datatime = "0分";
      long nm = 1000 * 60;// 一分钟的毫秒数
      long nh = 1000 * 60 * 60;// 一小时的毫秒数
@@ -45,26 +47,122 @@
      // 获得两个时间的毫秒时间差异
      long diff = endTime.getTime() - startTime.getTime();
      long day = diff / nd;// 计算差多少天
      long hour = diff % nd / nh;// 计算差多少小时
      long min = diff % nd % nh / nm;// 计算差多少分钟
      datatime = day + "天" + hour + "小时" + min + "分钟";
      if (day > 0) {
         datatime = day + "天" + hour + "时" + min + "分";
      } else {
         if (hour > 0) {
            datatime = hour + "时" + min + "分";
         } else {
            if (min < 0)
               min = 0;
            datatime = min + "分";
         }
      }
      return datatime;
   }
   public static DateInfo dateDiff3(long startTime, long endTime) throws Exception {
      long nm = 1000 * 60;// 一分钟的毫秒数
      long nh = 1000 * 60 * 60;// 一小时的毫秒数
      long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
      // 获得两个时间的毫秒时间差异
      long diff = endTime - startTime;
      int day = (int) (diff / nd);// 计算差多少天
      long hour = diff % nd / nh;// 计算差多少小时
      long minute = diff % nd % nh / nm;// 计算差多少分钟
      long second = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60); // 计算差多少秒
      DateInfo dateInfo = new DateInfo();
      dateInfo.setDay(day);
      dateInfo.setHour(hour);
      dateInfo.setMinute(minute);
      dateInfo.setSecond(second);
      return dateInfo;
   }
   public static String dateDiff4(Date startTime, Date endTime) throws Exception {
      String datatime = "0分";
      long nm = 1000 * 60;// 一分钟的毫秒数
      long nh = 1000 * 60 * 60;// 一小时的毫秒数
      long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
      // 获得两个时间的毫秒时间差异
      long diff = endTime.getTime() - startTime.getTime();
      long day = diff / nd;// 计算差多少天
      long hour = diff % nd / nh;// 计算差多少小时
      long min = diff % nd % nh / nm;// 计算差多少分钟
      if (day > 0) {
         datatime = day + "天";
      } else {
         if (hour > 0) {
            datatime = hour + "时";
         } else {
            if (min < 0)
               min = 0;
            datatime = min + "分";
         }
      }
      return datatime;
   }
   public static String dateDiff5(Date startTime, Date endTime) throws Exception {
      long nm = 1000 * 60;// 一分钟的毫秒数
      long nh = 1000 * 60 * 60;// 一小时的毫秒数
      long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
      // 获得两个时间的毫秒时间差异
      long diff = endTime.getTime() - startTime.getTime();
      long day = diff / nd;// 计算差多少天
      long hour = diff % nd / nh;// 计算差多少小时
      long min = diff % nd % nh / nm;// 计算差多少分钟
      long second = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 计算差多少秒
      String datatime = "";
      if (day > 0) {
         datatime = day + "天";
      } else if (hour > 0) {
         datatime = hour + "小时";
      } else if (min > 0) {
         datatime = min + "分钟";
      } else if (second > 0) {
         datatime = second + "秒";
      }
      return datatime;
   }
   public static long dateDiffMin(Date startTime, Date endTime) throws Exception {
      long nm = 1000 * 60;// 一分钟的毫秒数
      long nh = 1000 * 60 * 60;// 一小时的毫秒数
      long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
      // 获得两个时间的毫秒时间差异
      long diff = endTime.getTime() - startTime.getTime();
      long day = diff / nd;// 计算差多少天
      long hour = diff % nd / nh;// 计算差多少小时
      long min = diff % nd % nh / nm + day * 24 * 60 + hour * 60;// 计算差多少分钟
      return min;
   }
   /**
    * 通过时间秒毫秒数判断两个时间的间隔
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDaysByMillisecond(Date start, Date end) {
       return (int) ((end.getTime() - start.getTime()) / (1000*3600*24));
    }
    *
    * @param date1
    * @param date2
    * @return
    */
   public static int differentDaysByMillisecond(Date start, Date end) {
      return (int) ((end.getTime() - start.getTime()) / (1000 * 3600 * 24));
   }
   public String transferLongToDate(String dateFormat, Long millSec) {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
      Date date = new Date(millSec);
@@ -104,110 +202,284 @@
         return false;
      }
   }
   /**
    * 判断是否同一个月
    *
    * @param date1
    * @param date2
    * @return
    */
   public static boolean isSameMonth(Date date1, Date date2) {
      Calendar calendar1 = Calendar.getInstance();
      calendar1.setTime(date1);
      Calendar calendar2 = Calendar.getInstance();
      calendar2.setTime(date2);
      int year1 = calendar1.get(Calendar.YEAR);
      int year2 = calendar2.get(Calendar.YEAR);
      int month1 = calendar1.get(Calendar.MONTH);
      int month2 = calendar2.get(Calendar.MONTH);
      System.out.println(year1 + "  " + month1);
      System.out.println(year2 + "  " + month2);
      return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR)
            && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
   }
   /**
    * 指定日期加上天数后的日期
    * 
    * @param num
    *            增加的天数
    * @param nowDate
    *            创建时间
    * @param num     增加的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static String plusDay(int num, String nowDate) throws ParseException {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      Date currdate = format.parse(nowDate);
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, num);
      return format.format(ca.getTime());
   }
   /**
    * 指定日期加上天数后的日期
    * 
    * @param num
    *            增加的天数
    * @param nowDate
    *            创建时间
    * @param num     增加的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static Date plusDayReturnDate(int num, String nowDate) throws ParseException {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      Date currdate = format.parse(nowDate);
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, num);
      return ca.getTime();
   }
   /**
    * 指定日期加上天数后的日期
    *
    * @param num     增加的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static String plusDay(int num, Date currdate) throws ParseException {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, num);
      return format.format(ca.getTime());
   }
   /**
    * 指定日期加上天数后的日期
    *
    * @param num     增加的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static Date plusDayDate(int num, Date currdate) {
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, num);
      return ca.getTime();
   }
   /**
    * 加上月份
    *
    * @param currdate
    * @param num
    * @return
    */
   public static Date plusMonths(Date currdate, int num) {
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.MONTH, num);
      return ca.getTime();
   }
   /**
    * 加上年份
    *
    * @param currdate
    * @param num
    * @return
    */
   public static Date plusYears(Date currdate, int num) {
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.YEAR, num);
      return ca.getTime();
   }
   /**
    * 减去月份
    *
    * @param currdate
    * @param num
    * @return
    */
   public static Date reduceMonth(Date currdate, int num) {
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.MONTH, -num);
      return ca.getTime();
   }
   public static Date reduceDay(Date currdate, int num) {
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, -num);
      return ca.getTime();
   }
   
   /**
    * 指定日期减去天数后的日期
    * 
    * @param num
    *            减去的天数
    * @param nowDate
    *            创建时间
    * @param num     减去的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static String reduceDay(int num, String nowDate) throws ParseException {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      Date currdate = format.parse(nowDate);
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, -num); // 日期减 如果不够减会将月变动
      return format.format(ca.getTime());
   }
     /**
     * 计算两个日期之间相差的天数
     * @param smdate 较小的时间
     * @param bdate  较大的时间
     * @return 相差天数
     * @throws ParseException
     * calendar 对日期进行时间操作
     * getTimeInMillis() 获取日期的毫秒显示形式
     */
    public static int daysBetween(Date smdate,Date bdate) throws ParseException
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(smdate);
        long time1 = cal.getTimeInMillis();
        cal.setTime(bdate);
        long time2 = cal.getTimeInMillis();
        long between_days=(time2-time1)/(1000*3600*24);
        return Integer.parseInt(String.valueOf(between_days));
    }
    /**
     * 字符串日期格式的计算
     * @param smdate
     * @param bdate
     * @return
     * @throws ParseException
     */
    public static int daysBetween(String smdate,String bdate) throws ParseException{
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(sdf.parse(smdate));
        long time1 = cal.getTimeInMillis();
        cal.setTime(sdf.parse(bdate));
        long time2 = cal.getTimeInMillis();
        long between_days=(time2-time1)/(1000*3600*24);
        return Integer.parseInt(String.valueOf(between_days));
    }
   /**
    * 指定日期减去天数后的日期
    *
    * @param num     减去的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static String reduceDay2(int num, Date date) throws ParseException {
      // 设置要获取到什么样的时间
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      // 获取String类型的时间
      String date_str = format.format(date);
      Date currdate = format.parse(date_str);
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, -num); // 日期减 如果不够减会将月变动
      return format.format(ca.getTime());
   }
   /**
    * 指定日期减去天数后的日期
    *
    * @param num     减去的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static Date reduceDay(int num, Date date) throws ParseException {
      // 设置要获取到什么样的时间
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      // 获取String类型的时间
      String date_str = format.format(date);
      Date currdate = format.parse(date_str);
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, -num); // 日期减 如果不够减会将月变动
      return ca.getTime();
   }
   /**
    * 指定日期减去天数后的日期
    *
    * @param num     减去的天数
    * @param nowDate 创建时间
    * @return
    * @throws ParseException
    */
   public static String reduceDayTostring(int num, Date date) throws ParseException {
      // 设置要获取到什么样的时间
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
      // 获取String类型的时间
      String date_str = format.format(date);
      Date currdate = format.parse(date_str);
      Calendar ca = Calendar.getInstance();
      ca.setTime(currdate);
      ca.add(Calendar.DATE, -num); // 日期减 如果不够减会将月变动
      return format.format(ca.getTime());
   }
   /**
    * 计算两个日期之间相差的天数
    *
    * @param smdate 较小的时间
    * @param bdate  较大的时间
    * @return 相差天数
    * @throws ParseException calendar 对日期进行时间操作 getTimeInMillis() 获取日期的毫秒显示形式
    */
   public static int daysBetween(Date minDate, Date maxDate) throws ParseException {
      Calendar cal = Calendar.getInstance();
      cal.setTime(minDate);
      long minTime = cal.getTimeInMillis();
      cal.setTime(maxDate);
      long maxTime = cal.getTimeInMillis();
      long between_days = (maxTime - minTime) / (1000 * 3600 * 24);
      return Integer.parseInt(String.valueOf(between_days));
   }
   /**
    * 字符串日期格式的计算
    *
    * @param smdate
    * @param bdate
    * @return 单位天数
    * @throws ParseException
    */
   public static int daysBetween2(Date minDate, Date maxDate) throws ParseException {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      return daysBetween(sdf.format(minDate), sdf.format(maxDate));
   }
   /**
    * 字符串日期格式的计算
    *
    * @param smdate
    * @param bdate
    * @return
    * @throws ParseException
    */
   public static int daysBetween(String minDate, String maxDate) throws ParseException {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      Calendar cal = Calendar.getInstance();
      cal.setTime(sdf.parse(minDate));
      long minTime = cal.getTimeInMillis();
      cal.setTime(sdf.parse(maxDate));
      long maxTime = cal.getTimeInMillis();
      long between_days = (maxTime - minTime) / (1000 * 3600 * 24);
      return Integer.parseInt(String.valueOf(between_days));
   }
   /**
    * 返回中间日期
    *
    * @param startTime
    * @param endTime
    * @return
@@ -233,23 +505,139 @@
      }
      return listDate;
   }
   /**
     * @param args
     * @throws ParseException
     * format() 对日期进行格式化处理
     * parse() 将日期设置为date类型
     */
    public static void main(String[] args) throws ParseException {
        // TODO Auto-generated method stub
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d1=sdf.parse("2016-09-08 00:00:00");
        Date d2=sdf.parse("2016-09-08 00:00:00");
        System.out.println(daysBetween(d1,d2));
        System.out.println(daysBetween("2016-09-08 10:10:10","2016-09-29 00:00:00"));
    }
   /**
    * 随机减去几分钟
    *
    * @param date
    * @param min  随机添加的分钟数
    * @return
    */
   public static Date reduceRandomMinute(Date date, int min) {
      long rand = (long) (Math.random() * 1000 * 60 * min);
      long time = date.getTime() - rand;
      return new Date(time);
   }
   /**
    * 计算两时间月差
    *
    * @param startDate <String>
    * @param endDate   <String>
    * @return int
    * @throws ParseException
    */
   public static int getMonthSpace(String startDate, String endDate) throws ParseException {
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
      return getMonthSpace(sdf.parse(startDate), sdf.parse(endDate));
   }
   /**
    * 计算两时间月差
    *
    * @param startDate <String>
    * @param endDate   <String>
    * @return int
    * @throws ParseException
    */
   public static int getMonthSpace(Date startDate, Date endDate) {
      Calendar start = Calendar.getInstance();
      Calendar end = Calendar.getInstance();
      start.setTime(startDate);
      end.setTime(endDate);
      int result = end.get(Calendar.MONTH) - start.get(Calendar.MONTH);
      int month = (end.get(Calendar.YEAR) - start.get(Calendar.YEAR)) * 12;
      return Math.abs(month + result);
   }
   public static Date getTodayStartTime() {
      Calendar todayStart = Calendar.getInstance();
      todayStart.set(Calendar.HOUR_OF_DAY, 0);
      todayStart.set(Calendar.MINUTE, 0);
      todayStart.set(Calendar.SECOND, 0);
      todayStart.set(Calendar.MILLISECOND, 0);
      return todayStart.getTime();
   }
   public static Date getTodayEndTime() {
      Calendar todayEnd = Calendar.getInstance();
      todayEnd.set(Calendar.HOUR_OF_DAY, 23);
      todayEnd.set(Calendar.MINUTE, 59);
      todayEnd.set(Calendar.SECOND, 59);
      todayEnd.set(Calendar.MILLISECOND, 999);
      return todayEnd.getTime();
   }
   /**
    * 获取指定年月的第一天
    *
    * @param yearMonth
    * @return
    */
   public static String getFirstDayOfMonth(String yearMonth) {
      int year = Integer.parseInt(yearMonth.split("-")[0]); // 年
      int month = Integer.parseInt(yearMonth.split("-")[1]); // 月
      return getFirstDayOfMonth(year, month);
   }
   /**
    * 获取指定年月的第一天
    *
    * @param year
    * @param month
    * @return
    */
   public static String getFirstDayOfMonth(int year, int month) {
      Calendar cal = Calendar.getInstance();
      // 设置年份
      cal.set(Calendar.YEAR, year);
      // 设置月份
      cal.set(Calendar.MONTH, month - 1);
      // 获取某月最小天数
      int firstDay = cal.getMinimum(Calendar.DATE);
      // 设置日历中月份的最小天数
      cal.set(Calendar.DAY_OF_MONTH, firstDay);
      // 格式化日期
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      return sdf.format(cal.getTime());
   }
   /**
    * 获取指定年月的最后一天
    *
    * @param yearMonth
    * @return
    */
   public static String getLastDayOfMonth(String yearMonth) {
      int year = Integer.parseInt(yearMonth.split("-")[0]); // 年
      int month = Integer.parseInt(yearMonth.split("-")[1]); // 月
      return getLastDayOfMonth(year, month);
   }
   /**
    * 获取指定年月的最后一天
    *
    * @param year
    * @param month
    * @return
    */
   public static String getLastDayOfMonth(int year, int month) {
      Calendar cal = Calendar.getInstance();
      // 设置年份
      cal.set(Calendar.YEAR, year);
      // 设置月份
      cal.set(Calendar.MONTH, month - 1);
      // 获取某月最大天数
      int lastDay = cal.getActualMaximum(Calendar.DATE);
      // 设置日历中月份的最大天数
      cal.set(Calendar.DAY_OF_MONTH, lastDay);
      // 格式化日期
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
      return sdf.format(cal.getTime());
   }
   public static void main(String[] args) throws ParseException {
      System.out.println(getMonthSpace("2012-02", "2012-02"));
   }
}