package com.cloud.common.utils;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import java.beans.PropertyDescriptor;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 帮助工具类
**/
public class FunctionUtil {
public static boolean isValidEmail(String email) {
if ((email != null) && (!email.isEmpty())) {
return Pattern.matches("^(\\w+([-.][A-Za-z0-9]+)*){3,18}@\\w+([-.][A-Za-z0-9]+)*\\.\\w+([-.][A-Za-z0-9]+)*$", email);
}
return false;
}
public static boolean is18ByteIdCardComplex(String IDNumber) {
if (IDNumber == null || "".equals(IDNumber)) {
return false;
}
// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
"(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
//假设18位身份证号码:41000119910101123X 410001 19910101 123X
//^开头
//[1-9] 第一位1-9中的一个 4
//\\d{5} 五位数字 10001(前六位省市县地区)
//(18|19|20) 19(现阶段可能取值范围18xx-20xx年)
//\\d{2} 91(年份)
//((0[1-9])|(10|11|12)) 01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字 123(第十七位奇数代表男,偶数代表女)
//[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
//$结尾
//假设15位身份证号码:410001910101123 410001 910101 123
//^开头
//[1-9] 第一位1-9中的一个 4
//\\d{5} 五位数字 10001(前六位省市县地区)
//\\d{2} 91(年份)
//((0[1-9])|(10|11|12)) 01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字 123(第十五位奇数代表男,偶数代表女),15位身份证不含X
//$结尾
boolean matches = IDNumber.matches(regularExpression);
//判断第18位校验值
if (matches) {
if (IDNumber.length() == 18) {
try {
char[] charArray = IDNumber.toCharArray();
//前十七位加权因子
int[] idCardWi = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
//这是除以11后,可能产生的11位余数对应的验证码
String[] idCardY = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
int sum = 0;
for (int i = 0; i < idCardWi.length; i++) {
int current = Integer.parseInt(String.valueOf(charArray[i]));
int count = current * idCardWi[i];
sum += count;
}
char idCardLast = charArray[17];
int idCardMod = sum % 11;
if (idCardY[idCardMod].toUpperCase().equals(String.valueOf(idCardLast).toUpperCase())) {
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}
return matches;
}
/**
* 手机号验证
* @param phoneNum
* @return
*/
public static boolean CheckMobilePhoneNum(String phoneNum) {
String regex = "^(1[3-9]\\d{9}$)";
if (phoneNum.length() == 11) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(phoneNum);
if (m.matches()) {
return true;
}
}
return false;
}
/*
* 去除首尾指定字符
*
* str 字符串
* element 指定字符
*
*/
public static String trim(String str, String element) {
if (str == null || str.equals(""))
return str;
boolean beginIndexFlag;
boolean endIndexFlag;
do {
int beginIndex = str.indexOf(element) == 0 ? 1 : 0;
int endIndex = str.lastIndexOf(element) + 1 == str.length() ? str.lastIndexOf(element) : str.length();
str = str.substring(beginIndex, endIndex);
beginIndexFlag = (str.indexOf(element) == 0);
endIndexFlag = (str.lastIndexOf(element) + 1 == str.length());
} while (beginIndexFlag || endIndexFlag);
return str;
}
public static String GenerateGUID() {
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
public static String trimBothEndsChars(String srcStr, String splitter) {
String regex = "^" + splitter + "*|" + splitter + "*$";
return srcStr.replaceAll(regex, "");
}
/*
* 获取运行时类根目录路径
* 运行时类根目录路径
*/
public static String classesDirPath() {
Object object = new Object();
return object.getClass().getResource("/").getPath().replaceFirst("/", "");
}
/*
* 获取运行时webapp目录路径
* 运行时webapp目录路径
*/
public static String webappDirPath() {
return classesDirPath().replaceAll("WEB-INF/classes/", "");
}
/*
判断时间是否下午
*/
public static boolean ifAfternoonByDate(Date date) {
if (date == null) {
return false;
}
GregorianCalendar gregorianCalendar = new GregorianCalendar();
gregorianCalendar.setTime(date);
return gregorianCalendar.get(GregorianCalendar.AM_PM) != Calendar.AM;
}
/**
* 判断时间是否在时间段内
*
* @param nowTime
* @param beginTime
* @param endTime
* @return
*/
public static boolean belongCalendar(Date nowTime, Date beginTime,
Date endTime) {
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(beginTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
// if (end.getTimeInMillis() < begin.getTimeInMillis()) {
// end.add(Calendar.DATE, 1);
// }
// if (date.getTimeInMillis() < begin.getTimeInMillis() && date.getTimeInMillis() < end.getTimeInMillis()) {
// date.add(Calendar.DATE, 1);
// }
return date.getTimeInMillis() >= begin.getTimeInMillis() && date.getTimeInMillis() <= end.getTimeInMillis();
}
/**
* 汉字转拼音
*
* @author ssh
* @date 2021/5/6 15:20
*/
public static String HanZiChangePinYin(String ChineseLanguage) {
char[] cl_chars = ChineseLanguage.trim().toCharArray();
String hanyupinyin = "";
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出拼音全部小写
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不带声调
defaultFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
try {
for (int i = 0; i < cl_chars.length; i++) {
if (String.valueOf(cl_chars[i]).matches("[\u4e00-\u9fa5]+")) {// 如果字符是中文,则将中文转为汉语拼音
hanyupinyin += PinyinHelper.toHanyuPinyinStringArray(cl_chars[i], defaultFormat)[0];
} else {// 如果字符不是中文,则不转换
hanyupinyin += cl_chars[i];
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
System.out.println("字符不能转成汉语拼音");
}
return hanyupinyin;
}
public static byte[] gbk2utf8(String cheese) {
char c[] = cheese.toCharArray();
byte[] fullByte = new byte[3 * c.length];
for (int i = 0; i < c.length; i++) {
int m = (int) c[i];
String word = Integer.toBinaryString(m);
StringBuffer sb = new StringBuffer();
int len = 16 - word.length();
for (int j = 0; j < len; j++) {
sb.append("0");
}
sb.append(word);
sb.insert(0, "1110");
sb.insert(8, "10");
sb.insert(16, "10");
String s1 = sb.substring(0, 8);
String s2 = sb.substring(8, 16);
String s3 = sb.substring(16);
byte b0 = Integer.valueOf(s1, 2).byteValue();
byte b1 = Integer.valueOf(s2, 2).byteValue();
byte b2 = Integer.valueOf(s3, 2).byteValue();
byte[] bf = new byte[3];
bf[0] = b0;
fullByte[i * 3] = bf[0];
bf[1] = b1;
fullByte[i * 3 + 1] = bf[1];
bf[2] = b2;
fullByte[i * 3 + 2] = bf[2];
}
return fullByte;
}
/**
* 生成订单号
*
* @author csb
* @date 2021/05/28 18:36
**/
public static String getOrderNumber(String prefix) {
DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
Calendar calendar = Calendar.getInstance();
String dateName = df.format(calendar.getTime());
String randomString = RandomStringUtils.randomNumeric(8);
return prefix + dateName + randomString;
}
/**
* 对字符串处理:将指定位置到指定位置的字符以星号代替
*
* @param content 传入的字符串
* @param begin 开始位置
* @param end 结束位置
* @return
*/
public static String getStarString(String content, int begin, int end) {
if (begin >= content.length() || begin < 0) {
return content;
}
if (end >= content.length() || end < 0) {
return content;
}
if (begin >= end) {
return content;
}
String starStr = "";
for (int i = begin; i < end; i++) {
starStr = starStr + "*";
}
return content.substring(0, begin) + starStr + content.substring(end, content.length());
}
/**
* 对字符加星号处理:除前面几位和后面几位外,其他的字符以星号代替
*
* @param content 传入的字符串
* @param frontNum 保留前面字符的位数
* @param endNum 保留后面字符的位数
* @return 带星号的字符串
*/
public static String getStarString2(String content, int frontNum, int endNum) {
if (frontNum >= content.length() || frontNum < 0) {
return content;
}
if (endNum >= content.length() || endNum < 0) {
return content;
}
if (frontNum + endNum >= content.length()) {
return content;
}
String starStr = "";
for (int i = 0; i < (content.length() - frontNum - endNum); i++) {
starStr = starStr + "*";
}
return content.substring(0, frontNum) + starStr
+ content.substring(content.length() - endNum, content.length());
}
//是否拥有信息
public static boolean isEqualsList(String name, List<String> list) {
return list.stream().anyMatch(task -> task.equals(name));
}
/**
* 判断字符串中是否含有表情
*/
public static boolean containsEmoji(String source) {
int len = source.length();
boolean isEmoji = false;
for (int i = 0; i < len; i++) {
char hs = source.charAt(i);
if (0xd800 <= hs && hs <= 0xdbff) {
if (source.length() > 1) {
char ls = source.charAt(i + 1);
int uc = ((hs - 0xd800) * 0x400) + (ls - 0xdc00) + 0x10000;
if (0x1d000 <= uc && uc <= 0x1f77f) {
return true;
}
}
} else {
// non surrogate
if (0x2100 <= hs && hs <= 0x27ff && hs != 0x263b) {
return true;
} else if (0x2B05 <= hs && hs <= 0x2b07) {
return true;
} else if (0x2934 <= hs && hs <= 0x2935) {
return true;
} else if (0x3297 <= hs && hs <= 0x3299) {
return true;
} else if (hs == 0xa9 || hs == 0xae || hs == 0x303d
|| hs == 0x3030 || hs == 0x2b55 || hs == 0x2b1c
|| hs == 0x2b1b || hs == 0x2b50 || hs == 0x231a) {
return true;
}
if (!isEmoji && source.length() > 1 && i < source.length() - 1) {
char ls = source.charAt(i + 1);
if (ls == 0x20e3) {
return true;
}
}
}
}
return isEmoji;
}
/**
* 过滤掉字符串中的表情
*/
public static String filterEmoji(String source) {
if (StringUtils.isBlank(source)) {
return source;
}
StringBuilder buf = null;
int len = source.length();
for (int i = 0; i < len; i++) {
char codePoint = source.charAt(i);
if (isEmojiCharacter(codePoint)) {
if (buf == null) {
buf = new StringBuilder(source.length());
}
buf.append(codePoint);
}
}
if (buf == null) {
return source;
} else {
if (buf.length() == len) {
buf = null;
return source;
} else {
return buf.toString();
}
}
}
/**
* 判断某个字符是不是表情
*/
private static boolean isEmojiCharacter(char codePoint) {
return (codePoint == 0x0) || (codePoint == 0x9) || (codePoint == 0xA)
|| (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF));
}
/*
* 将时间戳转换为时间
*/
public static String stampToDate(String s) {
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(s);
Date date = new Date(lt);
res = simpleDateFormat.format(date);
return res;
}
public static Date stampToDateDT(String s) {
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long lt = new Long(s);
Date date = new Date(lt);
return date;
}
/*
* 将时间转换为时间戳
*/
public static String dateToStamp(String s) throws ParseException {
String res;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(s);
long ts = date.getTime();
res = String.valueOf(ts);
return res;
}
//将int型整数转成有符号的32位二进制数
public static String intTo32BitBinary(int x) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < 32; i++) {
sb.append(x & 1);
//无符号右移,高位补0,包括符号位在内一起右移
//>> 是有符号右移。符号位保持不变,负数高位补1,正数高位补0。
x = x >>> 1;
}
//得到32位的二进制字符串
String str32 = sb.reverse().toString();
return str32;
}
public static String autoGenericCode(String code, int num) {
String result = "";
result = String.format("%0" + num + "d", Integer.parseInt(code));
return result;
}
//返回的是字符串型的时间,输入的
//是String day, int x
public static Date addDateSecond(Date date, int x){
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 24小时制
//引号里面个格式也可以是 HH:mm:ss或者HH:mm等等,很随意的,不过在主函数调用时,要和输入的变
//量day格式一致
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.SECOND, x);// 24小时制
date = cal.getTime();
cal = null;
return date;
}
public static boolean isTheSameDay(Date d1,Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
return (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR))
&& (c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH))
&& (c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH));
}
/**
* 将Object对象里面的属性和值转化成Map对象
*
* @param obj
* @return
* @throws IllegalAccessException
*/
public static Map<String, Object> beanToMap(Object obj) {
Map<String, Object> params = new HashMap<String, Object>(0);
try {
PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(obj);
for (int i = 0; i < descriptors.length; i++) {
String name = descriptors[i].getName();
if (!"class".equals(name)) {
params.put(name, propertyUtilsBean.getNestedProperty(obj, name));
}
}
} catch (Exception e) {
e.printStackTrace();
}
return params;
}
/**
*根据日期获取是周几
*
* @param date
* @return
*/
public static String getDayofweek(String date){
Calendar calendar = Calendar.getInstance();
if (date.equals("")) {
calendar.setTime(new Date());
}else {
calendar.setTime(new Date(getDateByStr(date).getTime()));
}
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
return weekDays[calendar.get(Calendar.DAY_OF_WEEK)-1];
}
public static Date getDateByStr(String dd) {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = sd.parse(dd);
} catch (ParseException e) {
date = new Date();
}
return date;
}
/**
*判断平年、闰年
*
* @param year
* @return
*/
public static boolean isLeepYear(int year){ //创建boolean类型的方法
if((year%4==0&&year%100!=0)||(year%400==0)){ //平闰年判断算法
return true;
}
else{
return false;
}
}
private static boolean upperCase = false; // 包含大写字母
private static boolean lowerCase = false; // 包含小写字母
private static boolean letter = true; // 包含字母
private static boolean digit = true; // 包含数字
private static boolean special = false; // 包含特殊字符
private static Set<Character> specialCharSet = defaultSpecialCharSet(); // 特殊字符集合
private static int minLength = 6; // 最小长度
private static int maxLength = 16; // 最大长度
/**
* 密码符合规则,返回true
*/
public static boolean checkPassWord(String password){
if(password==null || password.length()<minLength || password.length()>maxLength){
// 长度不符合
return false;
}
boolean containUpperCase = false;
boolean containLowerCase = false;
boolean containLetter = false;
boolean containDigit = false;
boolean containSpecial = false;
for(char ch : password.toCharArray()){
if(Character.isUpperCase(ch)){
containUpperCase = true;
containLetter = true;
}else if(Character.isLowerCase(ch)){
containLowerCase = true;
containLetter = true;
}else if(Character.isDigit(ch)){
containDigit = true;
}else if(specialCharSet.contains(ch)){
containSpecial = true;
}else{
// 非法字符
return false;
}
}
if(upperCase && !containUpperCase){
return false;
}
if(lowerCase && !containLowerCase){
return false;
}
if(letter && !containLetter){
return false;
}
if(digit && !containDigit){
return false;
}
if(special && !containSpecial){
return false;
}
return true;
}
public static Set<Character> defaultSpecialCharSet(){
Set<Character> specialChars = new LinkedHashSet<>();
// 键盘上能找到的符号
specialChars.add(Character.valueOf('~'));
specialChars.add(Character.valueOf('`'));
specialChars.add(Character.valueOf('!'));
specialChars.add(Character.valueOf('@'));
specialChars.add(Character.valueOf('#'));
specialChars.add(Character.valueOf('$'));
specialChars.add(Character.valueOf('%'));
specialChars.add(Character.valueOf('^'));
specialChars.add(Character.valueOf('&'));
specialChars.add(Character.valueOf('*'));
specialChars.add(Character.valueOf('('));
specialChars.add(Character.valueOf(')'));
specialChars.add(Character.valueOf('-'));
specialChars.add(Character.valueOf('_'));
specialChars.add(Character.valueOf('+'));
specialChars.add(Character.valueOf('='));
specialChars.add(Character.valueOf('{'));
specialChars.add(Character.valueOf('['));
specialChars.add(Character.valueOf('}'));
specialChars.add(Character.valueOf(']'));
specialChars.add(Character.valueOf('|'));
specialChars.add(Character.valueOf('\\'));
specialChars.add(Character.valueOf(':'));
specialChars.add(Character.valueOf(';'));
specialChars.add(Character.valueOf('"'));
specialChars.add(Character.valueOf('\''));
specialChars.add(Character.valueOf('<'));
specialChars.add(Character.valueOf(','));
specialChars.add(Character.valueOf('>'));
specialChars.add(Character.valueOf('.'));
specialChars.add(Character.valueOf('?'));
specialChars.add(Character.valueOf('/'));
return specialChars;
}
/**
* 是否满足密码 包含大小写字母、数字及特殊符号,且长度在8-16位之间
* @param password
* @return
*/
public static boolean checkPasswordRule(String password){
String regex = "^(?=.*[0-9])(?=.*[a-z])[0-9a-zA-Z_!@#\\$%\\^&\\*`~()\\-\\+=]{6,16}$";
boolean isMatch = password.matches(regex);
if(isMatch){
return true;
}else {
return false;
}
}
/**
* 是否包含相同字符连续3位或3位以上
*/
public static boolean isReduplicate(String password) {
char[] chars = password.toCharArray();
for (int i = 0; i < chars.length - 2; i++) {
int n1 = chars[i];
int n2 = chars[i + 1];
int n3 = chars[i + 2];
// 判断重复字符
if (n1 == n2 && n1 == n3) {
return true;
}
}
return false;
}
/**
* 是否包含 & 符号
*/
public static boolean isASpecialCharacter(String password) {
//判断密码中是否有&符号
if(password.contains("&")){
return true;
}
return false;
}
/**
*去除文本中的html标签
* @param context
* @return
*/
public static String removeHtml(String context){
if(StringUtils.isEmpty(context)){
return context;
}
context = context.replaceAll("</?[^>]+>", "");
context = context.replaceAll("<a>\\s*|t|r|n</a>", "");
context = context.replaceAll(" ", "");
return context;
}
}
FunctionUtil工具类
最新推荐文章于 2024-03-21 16:20:44 发布