美文网首页
Java自编 ip代理池(二)

Java自编 ip代理池(二)

作者: Shimmer0118 | 来源:发表于2019-06-20 22:03 被阅读0次

        /**

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

        * @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;

      }

    }

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

    相关文章

      网友评论

          本文标题:Java自编 ip代理池(二)

          本文链接:https://www.haomeiwen.com/subject/nuusqctx.html