package com.njcn.jbsyncdata.util; import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.math.BigDecimal; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; import static java.lang.Integer.parseInt; /** * @author hongawen * @version 1.0.0 * @date 2021年04月12日 14:21 */ public class PubUtils { private final static ObjectMapper MAPPER = new ObjectMapper(); private static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss"; private static final String DATE = "yyyy-MM-dd"; private static final String TIME = "HH:mm:ss"; /** * 生成随机码,包含字母。--> 大写 * * @param length 随机码长度 */ public static String randomCode(int length) { return RandomUtil.randomString(length).toUpperCase(Locale.ENGLISH); } /**** * ***** ***** 验证IP是否属于某个IP段 ipSection IP段(以'-'分隔) ip 所验证的IP号码 ***** ***** **/ public static boolean ipExistsInRange(String ip, String ipSection) { ipSection = ipSection.trim(); ip = ip.trim(); int idx = ipSection.indexOf('-'); String beginIp = ipSection.substring(0, idx); String endIp = ipSection.substring(idx + 1); return getIp2long(beginIp) <= getIp2long(ip) && getIp2long(ip) <= getIp2long(endIp); } private static long getIp2long(String ip) { ip = ip.trim(); String[] ips = ip.split("\\."); long ip2long = 0L; for (int i = 0; i < 4; ++i) { ip2long = ip2long << 8 | parseInt(ips[i]); } return ip2long; } /** * 获取当前时间 * * @author cdf * @date 2021/7/26 */ public static String getNow() { DateFormat bf = new SimpleDateFormat("yyyyMMddHHmmss"); return bf.format(new Date()); } /** * 毫秒转时间 ms:需要转换的毫秒时间 */ public static Date ms2Date(Long ms) { Calendar c = Calendar.getInstance(); c.setTimeInMillis(ms); return c.getTime(); } /** * 日期转字符串函数 date:需要转换的日期 strFormat:转换的格式(yyyy-MM-dd HH:mm:ss) */ public static String date2String(Date date, String strFormat){ SimpleDateFormat format = new SimpleDateFormat(strFormat); return format.format(date); } /** * 获取当前web的IP */ public static String getLocalIp() { String host; try { host = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); host = "127.0.0.1"; } return host; } /** * 将JSON转为实体对象 * * @param jsonStr json * @param targetType 对象类型 * @param 对象 */ public static T json2obj(String jsonStr, Type targetType) { try { JavaType javaType = TypeFactory.defaultInstance().constructType(targetType); MAPPER.registerModule(new JavaTimeModule()); MAPPER.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return MAPPER.readValue(jsonStr, javaType); } catch (IOException e) { throw new IllegalArgumentException("将JSON转换为对象时发生错误:" + jsonStr, e); } } /** * 将实体对象转为JSON * * @param object 实体对象 */ public static String obj2json(Object object) { try { MAPPER.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); return MAPPER.writeValueAsString(object); } catch (IOException e) { throw new IllegalArgumentException("将将实体对象转为JSON时发生错误:" + object, e); } } /** * 判断一个数字是否在区间内 * * @param current 待判断数字 * @param min 最小值 * @param max 最大值 */ public static boolean rangeInDefined(int current, int min, int max) { return Math.max(min, current) == Math.min(current, max); } /** * 将起始日期字符串 yyyy-MM-dd 转为 yyyy-MM-dd HH:mm:ss的LocalDateTime */ public static LocalDateTime beginTimeToLocalDateTime(String beginTime) { beginTime = beginTime + StrUtil.SPACE + "00:00:00"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME); return LocalDateTime.parse(beginTime, dateTimeFormatter); } /** * 将截止日期字符串 yyyy-MM-dd 转为 yyyy-MM-dd HH:mm:ss的LocalDateTime */ public static LocalDateTime endTimeToLocalDateTime(String endTime) { endTime = endTime + StrUtil.SPACE + "23:59:59"; DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME); return LocalDateTime.parse(endTime, dateTimeFormatter); } /** * 将字符串日期转为LocalDate日期(只用于日期转换) */ public static LocalDate localDateFormat(String time) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE); return LocalDate.parse(time, dateTimeFormatter); } public static LocalDateTime localDateTimeFormat(String time) { DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DATE_TIME); return LocalDateTime.parse(time, dateTimeFormatter); } public static List getStartTimeEndTime(String beginDate, String endDate) throws Exception { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(beginDate)); List startTimeEndTime = null; for (long d = cal.getTimeInMillis(); d <= sdf.parse(endDate).getTime(); d = getDplaus(cal)) { startTimeEndTime.add(sdf.format(d)); } return startTimeEndTime; } public static long getDplaus(Calendar c) { c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1); return c.getTimeInMillis(); } public static String comFlag(Integer comFlag) { switch (comFlag) { case 0: return "中断"; case 1: return "正常"; default: return ""; } } public static String runFlag(Integer runFlag) { switch (runFlag) { case 0: return "投运"; case 1: return "热备用"; case 2: return "停运"; default: return ""; } } public static Integer getRunFlag(String runFlag) { switch (runFlag) { case "投运": return 0; case "热备用": return 1; case "停运": return 2; default: return -1; } } public static Double getDefectSeverity(String defectSeverity) { switch (defectSeverity) { case "轻缺陷": return 0.02; case "较重缺陷": return 0.12; case "严重缺陷": return 0.42; default: return 0.00; } } public static String ptType(Integer ptType) { switch (ptType) { case 0: return "星型接线"; case 1: return "三角型接线"; case 2: return "开口三角型接线"; default: return ""; } } public static Integer ptTypeName(String ptType) { switch (ptType) { case "星型接线": return 0; case "三角型接线": return 1; case "开口三角型接线": return 2; default: return -1; } } /** * 将当前时间的秒数置为0 * * @param date 时间 */ public static Date getSecondsAsZero(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.SECOND, 0); return calendar.getTime(); } /** * 根据起始时间和截止时间返回yyyy-MM-dd的日期, * * @param startTime 起始时间 * @param endTime 截止时间 */ public static List getTimes(Date startTime, Date endTime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); List result = new ArrayList<>(); Calendar start = Calendar.getInstance(); start.setTime(startTime); Calendar end = Calendar.getInstance(); end.setTime(endTime); end.set(end.get(Calendar.YEAR), end.get(Calendar.MONTH), end.get(Calendar.DAY_OF_MONTH), 0, 0, 0); long interval = end.getTimeInMillis() - start.getTimeInMillis(); result.add(sdf.format(start.getTime())); if (interval > 0) { int days = (int) (interval / 86400000); for (int i = 0; i < days; i++) { start.add(Calendar.DAY_OF_MONTH, 1); result.add(sdf.format(start.getTime())); } } return result; } /*** * 将instant转为date 处理8小时误差 * @author hongawen * @date 2023/7/20 15:58 * @param instant 日期 * @return Instant */ public static Date instantToDate(Instant instant){ return Date.from(instant.minusMillis(TimeUnit.HOURS.toMillis(8))); } /*** * 将date转为instant 处理8小时误差 * @author hongawen * @date 2023/7/20 15:58 * @param date 日期 * @return Instant */ public static Instant dateToInstant(Date date){ return date.toInstant().plusMillis(TimeUnit.HOURS.toMillis(8)); } /** * 根据参数返回float的四舍五入值 * * @param i 保留的位数 * @param value float原值 */ public static Float floatRound(int i, float value) { BigDecimal bp = new BigDecimal(value); return bp.setScale(i, BigDecimal.ROUND_HALF_UP).floatValue(); } //*****************************************xuyang添加,用于App******************************************************** /** * 正则表达式字符串 * 要匹配的字符串 * * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false; */ public static boolean match(String regex, String str) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); return matcher.matches(); } /** * 生成随机推荐码 */ public static String getCode(Integer number){ final String BASIC = "123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"; char[] basicArray = BASIC.toCharArray(); Random random = new Random(); char[] result = new char[number]; for (int i = 0; i < result.length; i++) { int index = random.nextInt(100) % (basicArray.length); result[i] = basicArray[index]; } return new String(result); } /** * 将字节数组转成Float数组 * @param bytes * @return */ public static List byteArrayToFloatList(byte[] bytes){ List d = new ArrayList<>(bytes.length/8); byte[] doubleBuffer = new byte[4]; for(int j = 0; j < bytes.length; j += 4) { System.arraycopy(bytes, j, doubleBuffer, 0, doubleBuffer.length); d.add(bytes2Float(doubleBuffer)); } return d; } public static float bytes2Float(byte[] arr) { int accum = 0; accum = accum|(arr[0] & 0xff); accum = accum|(arr[1] & 0xff) << 8; accum = accum|(arr[2] & 0xff) << 16; accum = accum|(arr[3] & 0xff) << 24; return Float.intBitsToFloat(accum); } /** * 将字节数组转成Double数组 * @param arr * @return */ public static List byteArrayToDoubleList(byte[] arr){ List d = new ArrayList<>(arr.length/8); byte[] doubleBuffer = new byte[8]; for(int j = 0; j < arr.length; j += 8) { System.arraycopy(arr, j, doubleBuffer, 0, doubleBuffer.length); d.add(bytes2Double(doubleBuffer)); } return d; } /** * 将byte转换成double * @param arr * @return */ public static double bytes2Double(byte[] arr) { long value = 0; for (int i = 0; i < 8; i++) { value |= ((long) (arr[i] & 0xff)) << (8 * i); } return Double.longBitsToDouble(value); } //***************************************************添加结束******************************************************** }