Java自编 ip代理池(二)

    /**

    * 计算两个日期之间相差的天数

    * @param date1

    *            start

    * @param date2

    *            end

    * @return

    */

  public static int daysBetween(Date date1, Date date2) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date1);

      long time1 = cal.getTimeInMillis();

      cal.setTime(date2);

      long time2 = cal.getTimeInMillis();

      long between_days = (time2 - time1) / (1000 * 3600 * 24);

      return Integer.parseInt(String.valueOf(between_days));

  }

  /**

    * 计算两个日期之间相差的月数 ,请用 后面参数-前面参数

    *

    * @param date1

    * @param date2

    * @return

    */

  public static int MonthsBetween(Date date1, Date date2) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date1);

      int year1 = cal.get(Calendar.YEAR);

      int month1 = cal.get(Calendar.MONTH);

      cal.setTime(date2);

      int year2 = cal.get(Calendar.YEAR);

      int month2 = cal.get(Calendar.MONTH);

      int m = (year2 - year1) * 12 + (month2 - month1);

      return m;

  }

  /**

    * 计算开始时间到月末与结束时间到月初之和

    *

    * @param StarDate

    * @param EndDate

    * @return day

    */

  public static int getDayByStarDateEndDate(Date StarDate, Date EndDate) {

      int dayStar = daysBetween(StarDate, getFirstDateOfNextMonth(StarDate));

      int dayEnd = daysBetween(getFirstDateOfCurrentMonth(EndDate), EndDate);

      int day = dayStar + dayEnd;

      if (day > 30) {

        day = 30;

      }

      return day;

  }

  /**

    * 计算两个相同天相差的天数

    *

    * @param date1

    * @param date2

    * @return

    */

  public static int DaysBetween(Date date1, Date date2) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date1);

      int day1 = cal.get(Calendar.DATE);

      cal.setTime(date2);

      int day2 = cal.get(Calendar.DATE);

      int d = day2 - day1;

      if (d > 30) {

        d = 30;

      }

      if (d < -30) {

        d = -30;

      }

      return d;

  }

  /**

    * 判断两个日期是否为同月

    *

    * @param date1

    * @param date2

    * @return

    */

  public static boolean booleanBetweenDate(Date date1, Date date2) {

      boolean falg = false;

      Calendar cal = Calendar.getInstance();

      cal.setTime(date1);

      int month1 = cal.get(Calendar.MONTH);

      cal.setTime(date2);

      int month2 = cal.get(Calendar.MONTH);

      int m = month2 - month1;

      if (m == 0) {

        falg = true;

      }

      return falg;

  }

  /**

    * 计算两个相同月相差的天数

    *

    * @param date1

    * @param date2

    * @return

    */

  public static int MonthCountBetween(Date date1, Date date2) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date1);

      int year1 = cal.get(Calendar.YEAR);

      int month1 = cal.get(Calendar.MONTH);

      cal.setTime(date2);

      int year2 = cal.get(Calendar.YEAR);

      int month2 = cal.get(Calendar.MONTH);

      int m = month2 - month1;

      int y = year2 - year1;

      return y * 12 + m;

  }

  public static Date getDateBeforTwelveMonth() {

      Calendar cal = Calendar.getInstance();

      cal.set(Calendar.DAY_OF_MONTH, 1);

      cal.set(Calendar.HOUR_OF_DAY, 0);

      cal.set(Calendar.MINUTE, 0);

      cal.set(Calendar.SECOND, 0);

      cal.add(Calendar.MONTH, -12);

      return cal.getTime();

  }

  /**

    * 传入时间字符串,加一天后返回Date

    *

    * @param date

    *            时间 格式 YYYY-MM-DD

    * @return

    */

  public static Date addDate(String date) {

      if (date == null)

        return null;

      Date tmpDate = parse(date, DATE_PATTERN_DEFAULT);

      Calendar cal = Calendar.getInstance();

      cal.setTime(tmpDate);

      cal.add(Calendar.DAY_OF_MONTH, 1);

      return cal.getTime();

  }

  /**

    * 得到某个日期的星期

    *

    * @param dt

    * @return Day of the week (0 - sunday)

    */

  public static int getWeekOfDate(Date dt) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(dt);

      int w = cal.get(Calendar.DAY_OF_WEEK) - 1;

      if (w < 0)

        w = 0;

      return w;

  }

  /**

    * 得某(月,季度,上半年,下半年,全年)第1天日期

    */

  public static Date getCurrentMonFirstDate(int month) {

      Calendar cal = Calendar.getInstance();

      if (month == 13) {

        cal.setTime(now());

        cal.set(Calendar.DAY_OF_YEAR, 1);

      } else if (month == 14 || month == 17) {

        cal.set(Calendar.MONTH, 5);

        cal.set(Calendar.DATE, 1);

      } else if (month == 15 || month == 19) {

        cal.set(Calendar.MONTH, 11);

        cal.set(Calendar.DATE, 1);

      } else if (month == 16) {

        cal.set(Calendar.MONTH, 2);

        cal.set(Calendar.DATE, 1);

      } else if (month == 18) {

        cal.set(Calendar.MONTH, 8);

        cal.set(Calendar.DATE, 1);

      } else {

        cal.set(Calendar.MONTH, (month - 1));

        cal.set(Calendar.DATE, 1);

      }

      return cal.getTime();

  }

  /**

    * 得某(月,季度,上半年,下半年,全年)最后1天日期

    */

  public static Date getCurrentMouLastDate(int month) {

      Calendar cal = Calendar.getInstance();

      if (month == 13) {

        cal.setTime(now());

        cal.set(Calendar.DAY_OF_YEAR, 1);

        cal.roll(Calendar.DAY_OF_YEAR, -1);

      } else if (month == 14 || month == 17) {

        cal.set(Calendar.MONTH, 5);

        cal.set(Calendar.DATE, 1);

        cal.roll(Calendar.DATE, -1);

      } else if (month == 15 || month == 19) {

        cal.set(Calendar.MONTH, 11);

        cal.set(Calendar.DATE, 1);

        cal.roll(Calendar.DATE, -1);

      } else if (month == 16) {

        cal.set(Calendar.MONTH, 2);

        cal.set(Calendar.DATE, 1);

        cal.roll(Calendar.DATE, -1);

      } else if (month == 18) {

        cal.set(Calendar.MONTH, 8);

        cal.set(Calendar.DATE, 1);

        cal.roll(Calendar.DATE, -1);

      } else {

        cal.set(Calendar.MONTH, (month - 1));

        cal.set(Calendar.DATE, 1);

        cal.roll(Calendar.DATE, -1);

      }

      return cal.getTime();

  }

  /**

    * 得到当月前几个月的列表 yyyy-mm-01

    *

    * @return

    */

  public static List<String> getBeforeMonth(int number) {

      List<String> list = new ArrayList<String>();

      Calendar cal = Calendar.getInstance();

      int month = cal.get(Calendar.MONTH);

      int year = cal.get(Calendar.YEAR);

      for (int i = 0; i < number; i++) {

        String yearMonth = new String();

        yearMonth = year + "-" + (month + 1);

        list.add(yearMonth);

        if (month == 0) {

            year--;

            month = 11;

            cal.set(Calendar.YEAR, year);

            cal.set(Calendar.MONTH, month);

        } else {

            month--;

            cal.set(Calendar.MONTH, month);

        }

      }

      return list;

  }

  /**

    * 查出某月的最后一天

    *

    * @param date

    *            Date

    * @return lastDayofMonthStr

    */

  public static String getLastDayofMonth(Date date) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      int month = cal.get(Calendar.MONTH) + 1;

      cal.set(Calendar.MONTH, month);

      cal.set(Calendar.DAY_OF_MONTH, 1);

      long lastTime = cal.getTimeInMillis() - (1000 * 3600 * 24);

      cal.setTimeInMillis(lastTime);

      return format(cal.getTime(), DATE_PATTERN_DEFAULT);

  }

  /**

    * 查出上月的最后一天

    *

    * @param date

    *            Date

    * @return lastDayofMonthStr

    */

  public static String getLastDayofMonthBeforeDate(Date date) {

      if (date == null) {

        date = now();

      }

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month);

      cal.set(Calendar.DAY_OF_MONTH, 1);

      long lastTime = cal.getTimeInMillis() - (1000 * 3600 * 24);

      cal.setTimeInMillis(lastTime);

      return format(cal.getTime(), DATE_PATTERN_DEFAULT);

  }

  /**

    * 返回当前日期

    *

    * @return Date

    * */

  public static Date getCurrentDate() {

      return parseDate(formatDate(now()));

  }

  /**

    * 返回当前日期

    *

    * @return Date

    * */

  public static String getCurrentDateStr() {

      return format(getCurrentDate(), DATE_PATTERN_DEFAULT);

  }

  /**

    * 返回当前日期

    *

    * @return Date

    * */

  public static String getCurrentDateStr2() {

      return format(getCurrentDate(), TIME_PATTERN_DEFAULT);

  }

  /**

    * 生成字符日期类型,无分隔符

    *

    * @param date

    * @param days

    * @return

    */

  public static String parseDate(Date date) {

      String name = "";

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      Integer year = cal.get(Calendar.YEAR);

      Integer month = cal.get(Calendar.MONTH) + 1;

      Integer day = cal.get(Calendar.DATE);

      String syear = year.toString();

      String smonth;

      String sday;

      if (month.intValue() < 10)

        smonth = "0" + month.toString();

      else

        smonth = month.toString();

      if (day.intValue() < 10)

        sday = "0" + day.toString();

      else

        sday = day.toString();

      name = syear + smonth + sday;

      return name;

  }

  /**

    * 根据指定日期月份加n且取下个月,得到个新日期

    *

    * @param date

    * @return date

    */

  public static Date getDateForMonthAddNew(java.util.Date date, int month) {

      java.util.Calendar c = java.util.Calendar.getInstance();

      c.setTime(date);

      c.set(c.get(java.util.Calendar.YEAR), c.get(java.util.Calendar.MONTH)

            + month, c.get(java.util.Calendar.DATE));

      Date nextDate = c.getTime();

      return nextDate;

  }

  /**

    * 得到某天当月第一天日期

    *

    * @param dateOfMonth

    * @return

    */

  public static Date getFirstDateOfCurrentMonth(Date dateOfMonth) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(dateOfMonth);

      cal.set(Calendar.DAY_OF_MONTH, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 得到某天当月某一天号

    *

    * @param dateOfMonth

    * @param theDay

    *            到某天

    * @return

    */

  public static Date getTheDateOfCurrentMonth(Date dateOfMonth, int theDay) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(dateOfMonth);

      cal.set(Calendar.DAY_OF_MONTH, theDay);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 得到某天下个月第一天日期

    *

    * @param dateOfMonth

    * @return

    */

  public static Date getFirstDateOfNextMonth(Date dateOfMonth) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(dateOfMonth);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month + 1);

      cal.set(Calendar.DAY_OF_MONTH, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 得到某天下下个月第一天日期

    *

    * @param dateOfMonth

    * @return

    */

  public static Date getFirstDateOfNextTwoMonth(Date dateOfMonth) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(dateOfMonth);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month + 2);

      cal.set(Calendar.DAY_OF_MONTH, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 取得某日m个月后得日子

    *

    * @param beforeDate

    * @param m

    * @return afterDate

    */

  public static Date getDateAfterCountMonth(Date beforeDate, int m) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(beforeDate);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month + m);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 取得某日m个月后得日子(改进版)

    *

    * @param beforeDate

    * @param m

    * @return afterDate

    */

  public static Date getDateAfterCountMonthByCal(Date beforeDate, int m) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(beforeDate);

      int month = cal.get(Calendar.MONTH);

      int day = cal.get(Calendar.DAY_OF_MONTH);

      // 判断是否为月末

      boolean isLastDay = isLastDayOfMonth(beforeDate);

      if (isLastDay) {

        // 是 返回m+1个月初

        cal.set(Calendar.MONTH, month + m + 1);

        cal.set(Calendar.DAY_OF_MONTH, 1);

        return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

      } else {

        // 否

        cal.set(Calendar.MONTH, month + m);

        Date newDate = parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

        Calendar newCal = Calendar.getInstance();

        newCal.setTime(newDate);

        int newDay = newCal.get(Calendar.DAY_OF_MONTH);

        // 判断 m 个后,相同号是否存在,如1月30日之后的1个月没有30日

        if (newDay == day) {

            // 如果存在,直接返回

            return newDate;

        } else {

            // 如果不存在,说明已经被推到下个月了(3月2日),直接该月初,如3月1日

            return getFirstDateOfCurrentMonth(newDate);

        }

      }

  }

  /**

    * 取得某日m个月前得日子

    *

    * @param beforeDate

    * @param m

    * @return afterDate

    */

  public static Date getDateBeforeCountMonth(Date beforeDate, int m) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(beforeDate);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month - m);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 取得某年第1天时期

    *

    * @param

    * @param

    * @return startDate

    */

  public static String getDateStratYearMonthDay() {

      Calendar cal = Calendar.getInstance();

      cal.setTime(now());

      cal.set(Calendar.DAY_OF_YEAR, 1);

      return format(cal.getTime(), DATE_PATTERN_DEFAULT);

  }

  /**

    * 取得某年下一年第1天时期

    *

    * @param

    * @param

    * @return endDate

    */

  public static String getDateNextYearMonthDay() {

      Calendar cal = Calendar.getInstance();

      cal.setTime(now());

      int year = cal.get(Calendar.YEAR);

      cal.set(Calendar.YEAR, year + 1);

      cal.set(Calendar.DAY_OF_YEAR, 1);

      return format(cal.getTime(), DATE_PATTERN_DEFAULT);

  }

  /**

    * 根据计算日期,取得下个季度的第一天

    *

    * @param date

    * @return

    */

  public static Date getFirstDateOfNextSeason(Date date) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      int month = cal.get(Calendar.MONTH);

      int year = cal.get(Calendar.YEAR);

      int returnMonth = 0;

      int returnYear = year;

      switch (month) {

      case 0:

        returnMonth = 3;

        break;

      case 1:

        returnMonth = 3;

        break;

      case 2:

        returnMonth = 3;

        break;

      case 3:

        returnMonth = 6;

        break;

      case 4:

        returnMonth = 6;

        break;

      case 5:

        returnMonth = 6;

        break;

      case 6:

        returnMonth = 9;

        break;

      case 7:

        returnMonth = 9;

        break;

      case 8:

        returnMonth = 9;

        break;

      case 9:

        returnMonth = 0;

        returnYear = year + 1;

        break;

      case 10:

        returnMonth = 0;

        returnYear = year + 1;

        break;

      case 11:

        returnMonth = 0;

        returnYear = year + 1;

        break;

      }

      cal.set(Calendar.MONTH, returnMonth);

      cal.set(Calendar.YEAR, returnYear);

      cal.set(Calendar.DATE, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 得到某天的上一年的同天日期

    *

    * @param dateOfMonth

    * @return

    */

  public static Date getDateOfPreviousYear(Date date) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      int year = cal.get(Calendar.YEAR);

      cal.set(Calendar.YEAR, year - 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 得到某天的年初日期

    *

    * @param dateOfMonth

    * @return

    */

  public static Date getFirstYearDate(Date date) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      cal.set(Calendar.MONTH, 0);

      cal.set(Calendar.DATE, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 取得上个月的同天日期

    */

  public static Date getDateOfPreviousMonth(Date date) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month - 1);

      cal.set(Calendar.DATE, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  /**

    * 判断给定日期是否为月末的一天

    *

    * @param date

    * @return true:是|false:不是

    */

  public static boolean isLastDayOfMonth(Date date) {

      Calendar calendar = Calendar.getInstance();

      calendar.setTime(date);

      calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1));

      if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {

        return true;

      }

      return false;

  }

  /**

    * 判断是否月初

    *

    * @param date

    * @return

    */

  public static boolean isFirstDayOfMonth(Date date) {

      Calendar calendar = Calendar.getInstance();

      calendar.setTime(date);

      if (calendar.get(Calendar.DAY_OF_MONTH) == 1) {

        return true;

      }

      return false;

  }

  /**

    * yyyy-MM-dd HH-mm-ss

    *

    * @return

    */

  /**

    * 取得某日m个月后月初的日子

    *

    * @param beforeDate

    * @param m

    * @return afterDate

    */

  public static Date getBeginDateAfterCountMonth(Date beforeDate, int m) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(beforeDate);

      int month = cal.get(Calendar.MONTH);

      cal.set(Calendar.MONTH, month + m);

      cal.set(Calendar.DATE, 1);

      return parseDate(format(cal.getTime(), DATE_PATTERN_DEFAULT));

  }

  public static String getDateMinute() {

      return nowString(TIME_PATTERN);

  }

  /**

    * 取得当前日期的下季度第一天

    *

    * @param args

    */

  public static Date getNextQuarterFirst(Date nowDate) {

      Calendar cal = Calendar.getInstance();

      cal.setTime(nowDate);

      int month = cal.get(Calendar.MONTH);

      int times = 3 - month % 3;

      return getDateAfterCountMonth(nowDate, times);

  }

  /**

    * @Description TODO(获取当天剩余分钟数)

    * @Author lvhaosir 2019/2/14 19:19

    * @Param

    * @return

    */

  public static long getDayRemaining(String claimGoodTime) {

      // 传入的时间为 YYYY-MM-dd 需改变为 yyyyMMdd

      claimGoodTime = claimGoodTime.replaceAll("-","");

      // 使用预定的 日期+ 235959  减去 当前时间

      String newYmd = claimGoodTime + "235959";

      String ymdhms = DateUtil.formatTimeTargetStr(new Date());

      System.out.println(ymdhms);

      System.out.println(" 净菜自提预定时间 >>> "+newYmd);

      System.out.println(" 净菜自提当前时间 >>> "+ymdhms);

      // 预定时间

      Date newYmdData = DateUtil.parse(newYmd, "yyyyMMddHHmmss");

      Date ymdhmsData = DateUtil.parse(ymdhms, "yyyyMMddHHmmss");

      long diff = newYmdData.getTime() - ymdhmsData.getTime();

      long days = diff / (1000 * 60 * 60 * 24);

      long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);

      long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);

      System.out.println(""+days+"天"+hours+"小时"+minutes+"分");

      long time = hours * 60 + minutes;

      System.out.println(time);

      return time;

  }

  /**

    * @Description TODO(获取传入时间与当前时间相差的小时数)

    * @Author lvhaosir 2019/4/2 17:43

    * @param startTime

    */

  public static long getDayRemainHours(Timestamp startTime) {

      // System.out.println(" 传入的时间为 >>> "+startTime);

      Timestamp nowTimestamp = DateUtil.nowTimestamp();

      // System.out.println(" 当前时间为 >>> "+nowTimestamp);

      // 预定时间

      long diff = startTime.getTime() - nowTimestamp.getTime();

      if (diff > 0) {

        long days = diff / (1000 * 60 * 60 * 24);

        long hours = (diff-days*(1000 * 60 * 60 * 24))/(1000* 60 * 60);

        return hours;

      }

      // long minutes = (diff-days*(1000 * 60 * 60 * 24)-hours*(1000* 60 * 60))/(1000* 60);

      // System.out.println(""+days+"天"+hours+"小时"+minutes+"分");

      // long time = hours * 60 + minutes;

      // System.out.println(time);

      return -1;

  }

  /*public static void main(String[] args) {

      String offWorkDate = "2019-03-15-00:00";

      System.out.println(offWorkDate.substring(0,10));

  }*/

  public static List<String> getResultTableName(Date date1, Date date2) {

      List<String> list = new ArrayList<String>();

      int daysBetween = daysBetween(date1, date2);

      if (daysBetween < 0) {

        return list;

      }

      Calendar cal = Calendar.getInstance();

      cal.setTime(date1);

      int month = cal.get(Calendar.MONTH) + 1;

      int year = cal.get(Calendar.YEAR);

      String result = "";

      //判断两个日期是否为同月,如果是直接返回当前月。

      boolean b = booleanBetweenDate(date1, date2);

      if (b) {

        if (month < 10) {

            result = "" + year + 0 + month;

        } else {

            result = "" + year + month;

        }

        list.add(result);

        return list;

      }

      int MonthsBetween = MonthsBetween(date1, date2);

      Calendar cal2 = Calendar.getInstance();

      cal2.setTime(date2);

      for (int i = 0; i <= MonthsBetween; i++) {

        if (month <= 12) {

            if ((month + i) < 10) {

              result = "" + year + 0 + (month + i);

            } else {

              result = "" + year + (month + i);

            }

        } else {

            if ((month + i - 12) < 10) {

              result = "" + (year + 1) + (month + i - 12);

            } else {

              result = "" + (year + 1) + (month + i - 12);

            }

        }

        list.add(result);

      }

      return list;

  }

  /**

    * 得到当天的后二天的日期

    *

    * @param day

    * @return

    */

  public static String getCurrentDateAfterDay(int day) {

      Calendar cal = Calendar.getInstance();

      long lastTime = cal.getTimeInMillis() + (1000 * 3600 * 24 * day);

      cal.setTimeInMillis(lastTime);

      return format(cal.getTime(), DATE_PATTERN_DEFAULT);

  }

  /**

    * 获取当前系统时间的星期数。

    * <p>

    * 结果显示格式根据系统语言环境确定,如zh_CN时显示为星期一

    * </p>

    *

    * @return

    */

  public static String getLocaleDayOfWeek() {

      Locale usersLocale = Locale.getDefault();

      DateFormatSymbols dfs = new DateFormatSymbols(usersLocale);

      String weekdays[] = dfs.getWeekdays();

      return weekdays[Calendar.getInstance().get(Calendar.DAY_OF_WEEK)];

  }

  /**

    * 获取友好时间

    * @param datetime 格式:2012-8-21 17:53:20

    * @return

    */

  public static String getFriendTime(Date datetime) { // 传入的时间格式必须类似于2012-8-21 17:53:20这样的格式

      if(datetime == null){

        return "";

      }

      String interval = null;

      Date d1 = datetime;

      // 用现在距离1970年的时间间隔new

      // Date().getTime()减去以前的时间距离1970年的时间间隔d1.getTime()得出的就是以前的时间与现在时间的时间间隔

      long time = new Date().getTime() - d1.getTime();// 得出的时间间隔是毫秒

      if (time / 1000 < 10 && time / 1000 >= 0) {

        // 如果时间间隔小于10秒则显示“刚刚”time/10得出的时间间隔的单位是秒

        interval = "刚刚";

        return interval;

      } else if (time / 1000 < 60 && time / 1000 > 0) {

        // 如果时间间隔小于60秒则显示多少秒前

        int se = (int) ((time % 60000) / 1000);

        interval = se + "秒前";

        return interval;

      } else if (time / 60000 < 60 && time / 60000 > 0) {

        // 如果时间间隔小于60分钟则显示多少分钟前

        int m = (int) ((time % 3600000) / 60000);// 得出的时间间隔的单位是分钟

        interval = m + "分钟前";

        return interval;

      } else if (time / 3600000 < 24 && time / 3600000 >= 0) {

        // 如果时间间隔小于24小时则显示多少小时前

        int h = (int) (time / 3600000);// 得出的时间间隔的单位是小时

        interval = h + "小时前";

        return interval;

      } else if (time / 3600000 >= 24 && time / 3600000 < 48) {

        // 如果时间间隔大于24个小时,小于48个小时

        interval = "昨天";

        return interval;

      } else if (time / 3600000 >= 48 && time / 3600000 < 72) {

        // 如果时间间隔大于48个小时,小于72个小时

        interval = "前天";

        return interval;

      } else {

        // 大于24小时,则显示正常的时间,但是不显示秒

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        interval = sdf.format(datetime);

        return interval;

      }

  }

  public static String strToDateFormat(String date,String strPattern,String toPattern) throws ParseException {

      SimpleDateFormat formatter = new SimpleDateFormat(strPattern);

      Date newDate= formatter.parse(date);

      formatter = new SimpleDateFormat(toPattern);

      return formatter.format(newDate);

  }

  /**

    * 计算两个日期之间相差的分钟数 (向上取整的整数),请用 后面参数-前面参数

    *

    * @param befDate

    * @param aftDate

    * @return min

    */

  public static int minsBetween(Date befDate, Date aftDate) {

      long befTime = befDate.getTime();

      long aftTime = aftDate.getTime();

      int mins = (int)Math.ceil((aftTime-befTime)/(60*1000.0));

      return mins;

  }

  //取得一个月的第一天

  public static String getFirstDay(Date d) {

      Calendar c = Calendar.getInstance();

      c.setTime(d);

      c.set(Calendar.DAY_OF_MONTH, 1);

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

      return sdf.format(c.getTime());

  }

  /**

    * 将Date类转换为XMLGregorianCalendar

    * @param date

    * @return

    */

  public static XMLGregorianCalendar dateToXmlDate(Date date){

      Calendar cal = Calendar.getInstance();

      cal.setTime(date);

      DatatypeFactory dtf = null;

      try {

        dtf = DatatypeFactory.newInstance();

      } catch (DatatypeConfigurationException e) {

      }

      XMLGregorianCalendar dateType = dtf.newXMLGregorianCalendar();

      dateType.setYear(cal.get(Calendar.YEAR));

      //由于Calendar.MONTH取值范围为0~11,需要加1

      dateType.setMonth(cal.get(Calendar.MONTH)+1);

      dateType.setDay(cal.get(Calendar.DAY_OF_MONTH));

      dateType.setHour(cal.get(Calendar.HOUR_OF_DAY));

      dateType.setMinute(cal.get(Calendar.MINUTE));

      dateType.setSecond(cal.get(Calendar.SECOND));

      return dateType;

  }

  /**

    * 将XMLGregorianCalendar转换为Date

    * @param cal

    * @return

    */

  public static Timestamp xmlDate2Date(XMLGregorianCalendar cal){

      return new Timestamp(cal.toGregorianCalendar().getTime().getTime());

  }

  /**

    * 获取包含任意时间的星期一和星期天的日期

    * @param d

    * @return

    */

  public static Map<String, Object> getWeekday(Date d) {

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // 设置时间格式

      Calendar cal = Calendar.getInstance();

      cal.setTime(d);

      // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了

      int dayWeek = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天

      if (1 == dayWeek) {

        cal.add(Calendar.DAY_OF_MONTH, -1);

      }

      cal.setFirstDayOfWeek(Calendar.MONDAY);// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一

      int day = cal.get(Calendar.DAY_OF_WEEK);// 获得当前日期是一个星期的第几天

      cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值

      String monday = sdf.format(cal.getTime());

      cal.add(Calendar.DATE, 6);

      String sunday = sdf.format(cal.getTime());

      Map<String, Object> weekday=new HashMap<>();

      weekday.put("monday", monday);

      weekday.put("sunday", sunday);

      return weekday;

  }

  /**

    * 某一月的天数

    */

  public static int whichMonth(String date) {

      int days = 0;

      if (date.equals(

            (Calendar.getInstance().get(Calendar.YEAR) + "-" + (Calendar.getInstance().get(Calendar.MONTH) + 1))

                  .toString())) {

        days = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);

      } else {

        SimpleDateFormat sdf = new SimpleDateFormat("", Locale.ENGLISH);

        sdf.applyPattern("yyyy-MM");

        Calendar calendar = new GregorianCalendar();

        try {

            calendar.setTime(sdf.parse(date));

        } catch (ParseException e) {

            e.printStackTrace();

        }

        days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

      }

      return days;

  }

  /**

    * 查询所有时间、今天0、最近三天3、最近一周7、最近一月30

    */

  public static String queryDate(Integer days) {

      SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");

      Date date=new Date();

      Calendar calendar = Calendar.getInstance();

      calendar.setTime(date);

      calendar.add(Calendar.DAY_OF_MONTH, -days);

      date = calendar.getTime();

      System.out.println(sdf.format(date));

      return sdf.format(date);

  }

  /**

    * 根据年月查询对应月的天数

    * @param year

    * @param month

    * @return

    */

  public static int getDaysByYearMonth(int year, int month) { 

        Calendar a = Calendar.getInstance(); 

        a.set(Calendar.YEAR, year); 

        a.set(Calendar.MONTH, month - 1); 

        a.set(Calendar.DATE, 1); 

        a.roll(Calendar.DATE, -1); 

        int maxDate = a.get(Calendar.DATE); 

        return maxDate; 

    }

    /**

    * 获取当月的 天数

    * */ 

  public static int getCurrentMonthDay() { 

        Calendar a = Calendar.getInstance(); 

        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 (Exception e) {

        // e.printStackTrace();

        // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对

        convertSuccess = false;

      }

      return convertSuccess;

  }

  /**

    * @Description TODO(获取下个月的时间,具体到 秒)

    * @Author lvhaosir 2019/3/29 17:04

    * @param startTime

    */

  public static Timestamp getNextMonth(Timestamp startTime) {

      String end1 = DateUtil.format(startTime, DateUtil.TIME_PATTERN_HHMMSS);

      System.out.println(startTime);

      Date dateAfterCountMonthByCal = DateUtil.getDateAfterCountMonthByCal(startTime, 1);

      String start1 = DateUtil.format(dateAfterCountMonthByCal, DateUtil.DATE_PATTERN_DEFAULT);

      StringBuilder sb = new StringBuilder(start1);

      sb.append(" ");

      sb.append(end1);

      Timestamp endTime = DateUtil.parseTimestampDefault(sb.toString());

      System.out.println(endTime);

      return endTime;

  }

  /**

    * 获取指定年月的最后一天

    * @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()) + " 23:59:59";

  }

  public static Timestamp getLastDayOfMonth(Timestamp timestamp) {

      int year = timestamp.getYear()+1900;

      int month = timestamp.getMonth() + 1;

      String lastDayOfMonth = getLastDayOfMonth(year, month);

      System.out.println(lastDayOfMonth);

      return DateUtil.parseTimestampDefault(lastDayOfMonth);

  }

}

对象池操作工具类

package com.sunshine.http_proxy.pool;

import com.sunshine.http_proxy.utils.HttpProxyConfig;

import org.apache.commons.pool.PoolableObjectFactory;

import org.apache.commons.pool.impl.GenericObjectPool;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

/**

 * 对象池操作操作工具

* @author xaingzi

*/

@SuppressWarnings({ "unchecked", "rawtypes" })

public class ObjectPool {

  public static Logger log = LoggerFactory.getLogger(ObjectPool.class);

  private static ObjectPool objectPool;

  private GenericObjectPool pool;

  private ObjectPool() {}

  private ObjectPool(Class cls, HttpProxyConfig httpProxyConfig) {

      this.pool = new GenericObjectPool(new ObjectPoolFactory(cls, httpProxyConfig));

      pool.setMaxActive(httpProxyConfig.getMaxActive());// 最大活动对象

      pool.setMaxIdle(httpProxyConfig.getMaxIdle());// 最大空闲对象

      pool.setMaxWait(httpProxyConfig.getMaxWait());// 最大等待时间

      pool.setTestOnReturn(httpProxyConfig.isTestOnReturn());

      pool.setTestOnBorrow(httpProxyConfig.isTestOnBorrow());

      pool.setLifo(httpProxyConfig.isLifo());

      pool.setTimeBetweenEvictionRunsMillis(httpProxyConfig.getTimeBetweenEvictionRunsMillis());

      pool.setNumTestsPerEvictionRun(httpProxyConfig.getNumTestsPerEvictionRun());

      pool.setTestWhileIdle(true);

  }

  public static ObjectPool getObjecPool(Class cls, HttpProxyConfig httpProxyConfig) {

      if (objectPool == null) {

        synchronized (ObjectPool.class) {

            if (objectPool == null) {

              objectPool = new ObjectPool(ProxyHost.class, httpProxyConfig);

            }

        }

      }

      return objectPool;

  }

  /**

    * 创建对象

    *

    * @return

    */

  public void makeObject() {

      try {

        log.info("创建对象");

        pool.addObject();

      } catch (Exception e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

      }

  }

  /**

    * 池中取出对象

    *

    * @param <T>

    * @return

    */

  public <T> T borrowObject() {

      T obj = null;

      try {

        obj = (T) pool.borrowObject();

        log.info("获得对象");

      } catch (Exception e) {

        System.out.println(e);

      }

      return obj;

  }

  /**

    * 对象放回池中

    *

    * @param obj

    */

  public void returnObject(Object obj) {

      try {

        pool.returnObject(obj);

        log.info("返还对象");

      } catch (Exception e) {

        System.out.println(e);

      }

  }

  /**

    * 检测对象

    *

    * @param obj

    * @return

    */

  public boolean validateObject(Object obj) {

      try {

        log.info("检测对象");

        return ((PoolableObjectFactory) pool).validateObject(obj);

      } catch (Exception e) {

        System.out.println(e);

      }

      return false;

  }

  /**

    * 销毁对象

    *

    * @param obj

    */

  public void destroyObject(Object obj) {

      try {

        pool.invalidateObject(obj);

        log.info("销毁对象");

      } catch (Exception e) {

        System.out.println(e);

      }

  }

  // 是否后进先出

  public void setLifo(boolean bool) {

      pool.setLifo(bool);

  }

  // 对象将在返回到后进行验证。

  public void setTestOnReturn(boolean bool) {

      pool.setTestOnReturn(bool);

  }

  // 是否在借用对象之前应该进行验证。

  public void setTestOnBorrow(boolean bool) {

      pool.setTestOnBorrow(bool);

  }

  // 返回最大活动对象

  public int getMaxActive() {

      return pool.getMaxActive();

  }

  // 返回最多可空闲对象

  public int getMaxIdle() {

      return pool.getMaxIdle();

  }

  // 返回当前在此对象池中休眠的对象的数目。

  public int getNumIdle() {

      return pool.getNumIdle();

  }

  // 返回已经从此对象池中借出的对象的总数

  public int getNumActive() {

      return pool.getNumActive();

  }

  // 将当前对象池与参数中给定的PoolableObjectFactory相关联。如果在当前状态下,无法完成这一操作,会有一个IllegalStateException异常抛出。

  public void setFactory(PoolableObjectFactory factory) {

      pool.setFactory(factory);

  }

  // 清空对象池,并销毁对象池中的所有对象

  public void clear() {

      pool.clear();

  }

  // 关闭对象池

  public void close() {

      try {

        pool.close();

      } catch (Exception e) {

        e.printStackTrace();

      }

  }

}

对象池管理工厂

package com.sunshine.http_proxy.pool;

import java.lang.reflect.Method;

import java.util.Date;

import com.sunshine.http_proxy.HttpProxyClientLocat;

import com.sunshine.http_proxy.utils.HttpProxyConfig;

import org.apache.commons.pool.PoolableObjectFactory;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;

import com.alibaba.fastjson.JSONObject;

import com.sunshine.http_proxy.utils.DateUtil;

/**

 * 对象池管理工厂

* @author xaingzi

*/

@SuppressWarnings({"unchecked", "rawtypes" })

public class ObjectPoolFactory implements PoolableObjectFactory {

  public static Logger log = LoggerFactory.getLogger(ObjectPoolFactory.class);

  private Class cls;

  private HttpProxyConfig httpProxyConfig;

  private static final String INIT_METHOD = "clearObject";// 有状态对象恢复初始化的方法

  public ObjectPoolFactory(Class cls, HttpProxyConfig httpProxyConfig) {

      this.cls = cls;

      this.httpProxyConfig = httpProxyConfig;

  }

  public void activateObject(Object arg0) throws Exception {

      log.info("有状态对象恢复初始化");

      try {

        cls.getDeclaredMethod(INIT_METHOD).invoke(arg0);// 有状态对象恢复初始化

      } catch (Exception e) {

      }

  }

  public void destroyObject(Object arg0) throws Exception {

      log.info("销毁要过期IP对象:"+arg0.toString());

  }

  public Object makeObject() throws Exception {

      synchronized (this){

        JSONObject json = HttpProxyClientLocat.getHttpClientProxyIpZhiMa8(httpProxyConfig);

        Object object = JSON.parseObject(json.getJSONArray("data").getJSONObject(0).toString(), cls);

        log.info("创建新IP对象:"+object.toString());

        return object;

      }

  }

  public void passivateObject(Object arg0) throws Exception {

  }

  public boolean validateObject(Object arg0) {

      //log.info("验证对象:"+arg0.toString());

      try {

        String fieldName = "expireTime";

        String firstLetter = fieldName.substring(0, 1).toUpperCase();

        String getter = "get" + firstLetter + fieldName.substring(1);

        Method method = arg0.getClass().getMethod(getter, new Class[] {});

        String value = (String) method.invoke(arg0, new Object[] {});

        Date date = DateUtil.parse(value, DateUtil.TIME_PATTERN_DEFAULT);

        log.info("距离截止有效期还剩:" + DateUtil.minsBetween(new Date(), date)+" 分钟");

        if (DateUtil.minsBetween(new Date(), date) <= httpProxyConfig.getTestTime()) {

            log.info(arg0.toString() + " 即将被销毁");

            return false;

        }

      } catch (Exception e) {

        log.error(e.toString());

      }

      return true;

  }

}

好了,今天的分享就到这,有什么疑问可以留言讨论。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容