java通过反射获取对象的所有的字段名称和值,判断值是否相等,不相等就打印出来。
/**
* 获取2个对象相同字段不同值
* @param obj1
* @param obj2
* @return
*/
public String getDiff(Object obj1, Object obj2) {
if(ObjectUtils.isNull(obj1) || ObjectUtils.isNull(obj2)){
return "";
}
StringBuffer sb = new StringBuffer();
try {
//获取对象所有字段
List fieldList1 = Arrays.stream(obj1.getClass().getDeclaredFields()).collect(Collectors.toList());
List fieldList2 = Arrays.stream(obj2.getClass().getDeclaredFields()).collect(Collectors.toList());
for (Field field1 : fieldList1) {
//获取相同字段
Field field2 = fieldList2.stream()
.filter(p -> p.getName().equals(field1.getName())
&& p.getType().getName().equals(field1.getType().getName())
)
.findFirst().orElse(null);
//存在相同字段,才比较值
if(ObjectUtils.isNull(field2)){
continue;
}
field1.setAccessible(true);
field2.setAccessible(true);
//得到值
Object value1 = field1.get(obj1);
Object value2 = field2.get(obj2);
//转成字符比较
String valueString1 = getStringValue(value1,field1.getType().getName());
String valueString2 = getStringValue(value2,field2.getType().getName());
String columnName = "";
//值不相等
if(!valueString1.equals(valueString2)){
// 是否引用ApiModelProperty注解
boolean bool = field1.isAnnotationPresent(ApiModelProperty.class);
if (bool) {
columnName = field1.getAnnotation(ApiModelProperty.class).value();//获取注解值
} else {
columnName = field1.getName();//没有写注解
}
sb.append(columnName).append(":").append(valueString1).append("(").append(valueString2).append(");");
}
};
}catch (Exception e){
LOG.info("获取2个对象相同字段不同值失败:"+e.getMessage());
}
return sb.toString();
}
/**
* 获取字段的值
* @param value
* @param type
* @return
*/
private String getStringValue(Object value,String type){
String stringValue = "";
if(ObjectUtils.isNull(value)){
return stringValue;
}
if("java.util.Date".equalsIgnoreCase(type)){
stringValue = DatetimeUtil.threadSafeFormatDate((Date) value);
} else {
stringValue = String.valueOf(value);
}
return stringValue;
}
日期工具类:
package com.hhgz.core.utils;
import org.apache.commons.lang3.StringUtils;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 日期工具类
* @author
*
*/
@SuppressWarnings("unused")
public class DatetimeUtil {
/**
* 不允许被创建
*/
private DatetimeUtil() {
throw new IllegalStateException("Utility class");
}
private static final String DEFAULT_FORMAT1 = "yyyy-MM-dd HH:mm:ss";
// 默认时间格式1 年-月-日 时:分:秒
private static final String DEFAULT_FORMAT2 = "yyyy-MM-dd";
// 默认时间格式2 年-月-日
private static final String DEFAULT_FORMAT3 = "HH:mm:ss";
// 默认时间格式3 时:分:秒
public static final long DAY_TIME_MILLIS = 24 * 60 * 60 * 1000;
// 工作台报表时间格式1 月.日 举例:8.1
private static final String REPORT_CHECKING_DEFAULT_FORMAT2 = "MM.dd";
//小程序打卡时间
private static final SimpleDateFormat wechatPunchTime = new SimpleDateFormat("HH:mm");
/**
* 默认的格式
*/
private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DEFAULT_FORMAT1);
private static final SimpleDateFormat simpleDateFormat2 = new SimpleDateFormat(DEFAULT_FORMAT2);
private static final SimpleDateFormat reportCheckDateFormat = new SimpleDateFormat(REPORT_CHECKING_DEFAULT_FORMAT2);
/**
* 设备时间
*/
private static final SimpleDateFormat timeLogSimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd-'T'HH:mm:ss'Z'");
// 一天的毫秒数
/**
* 获得当前时间的字符串
*
* @param format 格式化字符串,如"yyyy-MM-dd HH:mm:ss"
* @return String类型的当前日期时间
*/
public static String getCurrentDatetime(String format) {
String currentDateTime = null;
if (null == format || "".equals(format)) {
return null;
}
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar calendar = new GregorianCalendar();
currentDateTime = simpleDateFormat.format(calendar.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return currentDateTime;
}
/**
* 得到当前时间的格式化时间
*
* @return 年-月-日 时:分:秒 格式的当前时间
*/
public static String getCurrentDatetime() {
return getCurrentDatetime(DEFAULT_FORMAT1);
}
/**
* 获得指定时间的date格式
*
* @param date 指定时间Date类型
* @param format 格式化字符串
* @return 格式化完后的时间
*/
public static String getDate(Date date, String format) {
String currentDate = null;
try {
SimpleDateFormat formatter = new SimpleDateFormat(format);
currentDate = formatter.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return currentDate;
}
/**
* 获得指定毫秒数,指定格式的格式化时间
*
* @param time 毫秒数
* @param format 格式化字符串
* @return 格式化后的时间
*/
public static String getDate(long time, String format) {
Date date = new Date(time);
return getDate(date, format);
}
/**
* 获得指定Date类型的格式化时间(yyyy-MM-dd)
*
* @param date 时间Date
* @return 格式化后的时间
*/
public static String getDate(Date date) {
if(date == null){
return "";
}
return getDate(date, DEFAULT_FORMAT2);
}
/**
* 字符(yyyy-MM-dd)日期转为Date类型
* @param date
* @return
*/
public static Date string2Date(String date){
if(StringUtils.isEmpty(date)){
return null;
}
try{
return simpleDateFormat.parse(date);
} catch (Exception e){
e.printStackTrace();
return null;
}
}
/**
* 字符(yyyy-MM-dd)日期转为Date类型
* @param date
* @return
*/
public static Date string2Datetime(String date){
if(StringUtils.isEmpty(date)){
return null;
}
try{
return simpleDateFormat2.parse(date);
} catch (Exception e){
e.printStackTrace();
return null;
}
}
/**
* 获得指定毫秒数的格式化时间
*
* @param time 毫秒数
* @return 格式化后的时间
*/
public static String getDate(long time) {
return getDate(time, DEFAULT_FORMAT2);
}
/**
* 获得当前时间指定格式化字符串的格式化时间
*
* @param format 格式化字符串
* @return 格式化后的时间
*/
public static String getCurrentDate(String format) {
return getDate(System.currentTimeMillis(), format);
}
/**
* 获得当前时间的格式化时间
*
* @return 格式化后的时间
*/
public static String getCurrentDate() {
return getDate(System.currentTimeMillis(), DEFAULT_FORMAT2);
}
/**
* 获取当前时间
* @return
*/
public static String getDatetime() {
return getDatetime(new Date());
}
/**
* 获得指定Date类型的毫秒数
*
* @param date 指定的Date
* @return 指定Date类型的毫秒数
*/
public static long getTimeMillis(Date date) {
return date.getTime();
}
/**
* 获得当前时间的毫秒数
*
* @return 当前时间的毫秒数
*/
public static long getCurrentDayTimeMillis() {
return System.currentTimeMillis();
}
/**
* 得到当前时间后一天的TimeMillis
*
* @return 当前时间后一天的TimeMillis
*/
public static long getNextDayTimeMillis() {
return getCurrentDayTimeMillis() + DAY_TIME_MILLIS;
}
/**
* 得到当前时间前一天的TimeMillis
*
* @return 当前时间前一天的TimeMillis
*/
public static long getPreDayTimeMillis() {
return getCurrentDayTimeMillis() - DAY_TIME_MILLIS;
}
/**
* 根据输入的String 例如 2013-03-07, 返回周四
*
* @param strDate
* @return
*/
public static String getDayOfweek(String strDate) {
Calendar calendar = Calendar.getInstance();
if (strDate == null) {
return null;
}
String[] dateSlipt = strDate.split("-");
if (dateSlipt.length != 3 | dateSlipt.length == 0) {
return null;
}
calendar.set(Calendar.YEAR, Integer.valueOf(dateSlipt[0]));
calendar.set(Calendar.MONTH, Integer.valueOf(dateSlipt[1]) - 1);
calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(dateSlipt[2]));
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
return getSimpleDateOfWeek(dayOfWeek);
}
/**
* 根据输入的i,i 为 calendar的星期索引,返回星期几
*
* @param i calendar的星期索引
* @return 星期几
*/
public static String getDateOfWeek(int i) {
String date = null;
switch (i) {
case Calendar.SUNDAY:
date = "星期日";
break;
case Calendar.MONDAY:
date = "星期一";
break;
case Calendar.TUESDAY:
date = "星期二";
break;
case Calendar.WEDNESDAY:
date = "星期三";
break;
case Calendar.THURSDAY:
date = "星期四";
break;
case Calendar.FRIDAY:
date = "星期五";
break;
case Calendar.SATURDAY:
date = "星期六";
break;
default:
break;
}
return date;
}
/**
* 根据输入的i,i 为 calendar的星期索引,返回星期几
*
* @param i calendar的星期索引
* @return 周几
*/
public static String getSimpleDateOfWeek(int i) {
String date = null;
switch (i) {
case Calendar.SUNDAY:
date = "周日";
break;
case Calendar.MONDAY:
date = "周一";
break;
case Calendar.TUESDAY:
date = "周二";
break;
case Calendar.WEDNESDAY:
date = "周三";
break;
case Calendar.THURSDAY:
date = "周四";
break;
case Calendar.FRIDAY:
date = "周五";
break;
case Calendar.SATURDAY:
date = "周六";
break;
default:
break;
}
return date;
}
/**
* 将格式化过的时间串转换成毫秒
*
* @param day 将格式化过的时间
* @param format 格式化字符串
* @return 毫秒
*/
public static long convertMillisecond(String day, String format) {
if (day == null || format == null)
return 0;
SimpleDateFormat formatter = new SimpleDateFormat(format);
try {
Date dt = formatter.parse(day);
return dt.getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
/**
* 得到两个日期的天数
*
* @param beginDate
* @param endDate
* @return 天数
*/
public static int getDateInterval(String beginDate, String endDate) {
Date date1 = null;
Date date2 = null;
long betweenDays = 0;
try {
date1 = new SimpleDateFormat("yyyy-MM-dd").parse(beginDate);
date2 = new SimpleDateFormat("yyyy-MM-dd").parse(endDate);
long beginTime = date1.getTime();
long endTime = date2.getTime();
betweenDays = (long) ((endTime - beginTime) / (1000 * 60 * 60 * 24));
} catch (ParseException e) {
e.printStackTrace();
}
return (int) betweenDays;
}
/**
* 得到两个日期的天数
*
* @param beginDate
* @param endDate
* @return 天数
*/
public static int getDateInterval(Date beginDate, Date endDate) {
long betweenDays = 0;
long beginTime = beginDate.getTime();
long endTime = endDate.getTime();
betweenDays = (endTime - beginTime) / (1000 * 60 * 60 * 24);
return (int) betweenDays;
}
/**
* 得到两个日期的小时数
*
* @param beginDate
* @param endDate
* @return 天数
*/
public static int getHourInterval(Date beginDate, Date endDate) {
long betweenHours = 0;
long beginTime = beginDate.getTime();
long endTime = endDate.getTime();
betweenHours = (endTime - beginTime) / (1000 * 60 * 60);
return (int) betweenHours;
}
/**
* 得到两个日期的小时数
*
* @param beginDate
* @param endDate
* @return 天数
*/
public static int getMinuteInterval(Date beginDate, Date endDate) {
long betweenMinutes = 0;
long beginTime = beginDate.getTime();
long endTime = endDate.getTime();
betweenMinutes = (endTime - beginTime) / (1000 * 60);
return (int) betweenMinutes;
}
/**
* 时间比较
*
* @param format 格式化字符串
* @param time1 时间1
* @param time2 时间2
* @return time1比time2早返回-1,time1与time2相同返回0,time1比time2晚返回1
*/
public static int compareTime(String format, String time1, String time2) {
if (format == null || time1 == null || time2 == null)
return 0;
SimpleDateFormat formatter = new SimpleDateFormat(format);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
try {
c1.setTime(formatter.parse(time1));
c2.setTime(formatter.parse(time2));
} catch (ParseException e) {
e.printStackTrace();
}
return c1.compareTo(c2);
}
/**
* 标准时间格式转换成date
* @param dateStr
* @return
*/
public static Date toDate(String dateStr) {
if(StringUtils.isEmpty(dateStr)) {
return new Date();
}
try {
return simpleDateFormat.parse(dateStr);
} catch (ParseException e) {
// TODO Auto-generated catch block
return new Date();
}
}
/**
* 格式化日期
* @param datetime
* @return
*/
public static String getDatetime(Date datetime) {
return ObjectUtils.isNull(datetime) ? null : simpleDateFormat.format(datetime);
}
/**
* 获取当前的日期 时分秒毫秒为0
* @return
*/
public static Date getCurrentDateTime(){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,0);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
return calendar.getTime();
}
/**
* 获取星期 从0开始星期天,老外的第一天是从星期日开始的
* @param date
* @return
*/
public static int getDayOfWeek(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_WEEK);
}
/**
* 出勤率日期格式
* @param date
* @return
*/
public static String getReportCheckingDate(Date date){
if(date == null){
return "";
}
return reportCheckDateFormat.format(date);
}
/**
* 根据时间返回当天的Date对象 如:8:00 变成 2019年9月7日08:00:00
* @param time
* @return
*/
public static Date getTime(String time){
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.SECOND,0);
calendar.set(Calendar.MILLISECOND,0);
try{
String[] hourAndMinute = time.split(":");
if(hourAndMinute.length >= 1){
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hourAndMinute[0]));
}
if(hourAndMinute.length >= 2){
calendar.set(Calendar.MINUTE, Integer.parseInt(hourAndMinute[1]));
}
}catch (Exception e){
e.printStackTrace();
}
return calendar.getTime();
}
/**
* 返回小程序打卡时间
* @param date
* @return
*/
public static String getWechatPunchTime(Date date){
return wechatPunchTime.format(date);
}
/**
* 计算两个时间差 返回分钟(结束时间 - 开始时间)
* @param startTime
* @param endTime
* @return
*/
public static int getDiffMinute(Date startTime, Date endTime){
long diffMillisecond = endTime.getTime() - startTime.getTime();//相差的毫秒数
return (int)(diffMillisecond / 1000 / 60);
}
/**
* 获取设备打卡时间
* @param timeStr
* @return
*/
public static Date getTimeLogTime(String timeStr){
try {
return timeLogSimpleDateFormat.parse(timeStr);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* 清空时分秒
* @param date
* @return
*/
public static Date cleanHourMinuteSecond(Date date){
if(ObjectUtils.isNull(date)){
return null;
}
try {
return simpleDateFormat2.parse(simpleDateFormat2.format(date));
} catch (ParseException e) {
e.printStackTrace();
return date;
}
}
/**
* 日期格式化(线程安全)
*/
private static ThreadLocal sdfThreadLocal = new ThreadLocal(){
@Override
public SimpleDateFormat initialValue(){
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
/**
* 日期转成字符串(线程安全)
* @param date
* @return yyyy-MM-dd HH:mm:ss
*/
public static String threadSafeFormatDate(Date date) {
return date == null ? "" : sdfThreadLocal.get().format(date);
}
/**
* 字符串转成日期(线程安全)
* @param strDate yyyy-MM-dd HH:mm:ss
* @return
*/
public static Date threadSafeParse(String strDate) throws ParseException{
return StringUtils.isEmpty(strDate) ? null : sdfThreadLocal.get().parse(strDate);
}
/**
* 结束时间默认为当天23:59:59
* @param time
* @return
*/
public static Date getEndTime(Date time){
if(ObjectUtils.isNull(time)){
return null;
}
String strDate = simpleDateFormat2.format(time) + " 23:59:59";
try{
return threadSafeParse(strDate);
} catch (Exception e){
return null;
}
}
}