weaver-hrm-salary/src/com/engine/salary/formlua/func/date/DateTimeServiceImpl.java

1365 lines
48 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.engine.salary.formlua.func.date;
import com.alibaba.fastjson.JSONObject;
import com.engine.salary.formlua.entity.parameter.DataType;
import com.engine.salary.formlua.entity.parameter.DateAndString;
import com.engine.salary.formlua.entity.parameter.FuncNames;
import com.engine.salary.formlua.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.YearMonth;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @className
* @Description日期Excel函数,函数传递参数支持JSON或者直接传入所需的String值 函数自动判断参数类型String类型可以直接当作日期字符串使用如果是JSON则转成JSON对象后获取content值
* @Author
* @date
*/
public class DateTimeServiceImpl implements DateTimeService {
protected final Logger logger = LoggerFactory.getLogger(getClass());
private SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private String format = "yyyy-MM-dd HH:mm:ss";
private Calendar calendar = Calendar.getInstance();
// private RemoteAttendService remoteAttendService;
// private RemoteAttend4FormService remoteAttend4FormService;
// private TenantHttpInvokerService tenantHttpInvokerService;
/**
* 返回当前日期时间
*
* @return
*/
@Override
public DataType now(Object... objects) {
int number = IgnoreParamFilter.getSetFuncNumber(FuncNames.NOW.toString());
if (objects.length > 0) {
return new DataType(DataType.STRING, "");
}
formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowStr = formatter.format(new Date());
return new DataType(DataType.STRING, nowStr);
}
/**
* 返回当前日期
*
* @return
*/
@Override
public DataType today(Object... objects) {
int number = IgnoreParamFilter.getSetFuncNumber(FuncNames.TODAY.toString());
if (objects.length > 0) {
return new DataType(DataType.STRING, "");
}
formatter = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = formatter.format(new Date());
return new DataType(DataType.STRING, dateStr);
}
/**
* 格式化时间日期
*
* @param objects
* @return
*/
@Override
public DataType dateFormat(Object... objects) {
Class[] typeObjects = new Class[]{DateAndString.class, String.class};
String func = "DATEFORMAT";
IgnoreParamFilter.commonFilter(func, 2, 2, typeObjects, objects);
Object result = objects[0];
String dateStr = "";
Object p1 = objects[0];
Object p2 = objects[1];
if (ExcelParamUtil.checkIsNull(p1, p2)) {
throw new RuntimeException("日期格式化函数参数不能为空");
}
if (p1 instanceof DataType) {
DataType dataType = (DataType) p1;
dateStr = ExcelParamUtil.getParamContent(dataType.getContent(), "date") != null ? ExcelParamUtil.getParamContent(dataType.getContent(), "date").toString() : "";
} else {
if (p1 instanceof Date) {
dateStr = formatter.format(p1);
} else {
dateStr = p1.toString();
}
}
String formatStr = (ExcelParamUtil.getParamContent(p2, "string") != null ? ExcelParamUtil.getParamContent(p2, "string") : "").toString().replaceAll("D", "d");
try {
String formatterStr = DateUtil.buildFormat(dateStr);
formatter = new SimpleDateFormat(formatterStr);
Date sourceDate = formatter.parse(dateStr);
formatter = new SimpleDateFormat(formatStr);
dateStr = formatter.format(sourceDate);
result = dateStr;
} catch (ParseException e) {
logger.error("err", e);
return new DataType(DataType.STRING, "");
}
return new DataType(DataType.STRING, result);
}
/**
* 两个日期加减
*
* @param
* @param
* @return
*/
@Override
public DataType dateDiff(Object... objects) {
Class[] typeObjects = new Class[]{DateAndString.class, DateAndString.class, String.class};
IgnoreParamFilter.commonFilter("DATEDIFF", 2, 3, typeObjects, objects);
Long secondsL = new Long(60 * 60 * 1000);//计算日期时间间距的单位,默认为小时
Long nd = buildSecondsFmt("D");
Long nh = buildSecondsFmt("H");
Long nm = buildSecondsFmt("I");
Long ns = buildSecondsFmt("S");
Double result = new Double(0);
String type = "D";
String sContent = DateUtil.getContent(objects[0], formatter);
String eContent = DateUtil.getContent(objects[1], formatter);
if (ExcelParamUtil.checkIsNull(sContent, eContent, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
Date startDate = null;
Date endDate = null;
format = DateUtil.buildFormat(sContent);
startDate = formateDateStr(sContent, format);
format = DateUtil.buildFormat(eContent);
endDate = formateDateStr(eContent, format);
if (startDate == null || endDate == null) {
return new DataType(DataType.NUMBER, 0);
}
Calendar cal1 = Calendar.getInstance();
cal1.setTime(startDate);
//当前时间
Calendar cal2 = Calendar.getInstance();
cal2.setTime(endDate);
long diff = cal2.getTime().getTime() - cal1.getTime().getTime();
if (objects.length == 3) {
type = ExcelParamUtil.getParamContent(objects[2], "string") != null ? ExcelParamUtil.getParamContent(objects[2], "string").toString() : "";
secondsL = buildSecondsFmt(type);
}
Double time = new Double(0);
boolean checkType = true;
switch (type) {
case "Y":
time = DateTimeServiceImpl.getByField(cal1, cal2, Calendar.YEAR).doubleValue();
break;
case "M":
Long monthR = DateTimeServiceImpl.getByField(cal1, cal2, Calendar.YEAR) * 12 + DateTimeServiceImpl.getByField(cal1, cal2, Calendar.MONTH);
time = monthR.doubleValue();
break;
case "D":
double dayR = DateTimeServiceImpl.getTime(startDate, endDate) / (nd.doubleValue());
time = dayR;
break;
case "H":
double hourH = DateTimeServiceImpl.getTime(startDate, endDate) / (nh.doubleValue());
time = hourH;
break;
case "I":
double minuR = DateTimeServiceImpl.getTime(startDate, endDate) / (nm.doubleValue());
time = minuR;
break;
case "S":
double seconR = DateTimeServiceImpl.getTime(startDate, endDate) / ns.doubleValue();
time = seconR;
break;
default:
checkType = false;
break;
}
if (!checkType) {
return new DataType(DataType.STRING, "");
}
BigDecimal b = new BigDecimal(time);
double f1 = b.setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
result = f1;
return new DataType(DataType.NUMBER, result);
}
/**
* 日期加减天数
*
* @param objects
* @return
*/
@Override
public DataType dateAdd(Object... objects) {
Class[] typeObjects = new Class[]{DateAndString.class, Integer.class, String.class};
IgnoreParamFilter.commonFilter("DATEADD", 2, 3, typeObjects, objects);
String type = "D";
if (objects.length == 3) {
type = objects[2].toString();
}
Object tcontent = DateUtil.getContent(objects[0], formatter);
Double numD = Double.parseDouble(ExcelParamUtil.getParamContent(objects[1], "") != null ? ExcelParamUtil.getParamContent(objects[1], "").toString() : "");
int num = numD.intValue();
if (ExcelParamUtil.checkIsNull(tcontent, numD, type, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.STRING, "");
}
Object result = "";
try {
Date date = null;
if (tcontent instanceof String || tcontent instanceof Character) {
format = DateUtil.buildFormat(tcontent.toString());
if (null == format) {
return new DataType(DataType.STRING, "");
}
date = formateDateStr(tcontent.toString(), format);
} else {
date = (Date) tcontent;
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
boolean checkType = true;
switch (type) {
case "Y":
cal.add(Calendar.YEAR, num);
break;
case "M":
cal.add(Calendar.MONTH, num);
break;
case "D":
cal.add(Calendar.DAY_OF_MONTH, num);
break;
case "H":
cal.add(Calendar.HOUR_OF_DAY, num);
break;
case "I":
cal.add(Calendar.MINUTE, num);
break;
case "S":
cal.add(Calendar.SECOND, num);
break;
default:
checkType = false;
break;
}
if (!checkType) {
String func = "DATEADD";
return new DataType(DataType.STRING, "");
}
Date newDate = cal.getTime();
String nDate = formateDateStr(newDate, format);
result = nDate;
} catch (ParseException e) {
logger.error("err", e);
}
return new DataType(DataType.STRING, result);
}
/**
* 返回年份
*
* @param objects
* @return
*/
@Override
public DataType year(Object... objects) {
Object reuslt = new Object();
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("YEAR", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int year = 0;
try {
year = getDateTimeValue(date, "Y", "YEAR");
reuslt = year;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, reuslt);
}
/**
* 返回是今年第几月
*
* @param objects
* @return
*/
@Override
public DataType month(Object... objects) {
Object reuslt = new Object();
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("MONTH", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
boolean isDate = checkDateString(date != null ? date.toString() : "");
if (!isDate) {
return new DataType(DataType.NUMBER, 0);
}
int month = 0;
try {
month = getDateTimeValue(date, "M", "MONTH");
reuslt = month + 1;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, reuslt);
}
/**
* 返回日期是本月几号
*
* @param objects
* @return
*/
@Override
public DataType day(Object... objects) {
Object reuslt = new Object();
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("DAY", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int day = 0;
try {
day = getDateTimeValue(date, "D", "DAY");
reuslt = day;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, reuslt);
}
/**
* 返回时钟位置
*
* @param objects
* @return
*/
@Override
public DataType hour(Object... objects) {
Object reuslt = new Object();
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("HOUR", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
Integer hour = 0;
try {
hour = getDateTimeValue(date, "H", "HOUR");
reuslt = hour;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, reuslt);
}
/**
* 返回分钟位置
*
* @param objects
* @return
*/
@Override
public DataType minute(Object... objects) {
Object reuslt = new Object();
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("MINUTE", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int minute = 0;
try {
minute = getDateTimeValue(date, "I", "MINUTE");
reuslt = minute;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, reuslt);
}
/***
* 返回秒钟位置
* @param objects
* @return
*/
@Override
public DataType seconds(Object... objects) {
Object reuslt = new Object();
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("SECOND", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int seconds = 0;
try {
seconds = getDateTimeValue(date, "S", "SECOND");
reuslt = seconds;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, reuslt);
}
/**
* 计算是本月的第几周
*
* @param objects
* @return
*/
@Override
public DataType weekNum(Object... objects) {
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("WEEKNUM", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int weekNum = 0;
try {
weekNum = getDateTimeValue(date, "WM", "WEEKNUM");
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, weekNum);
}
/**
* 判断是周几因为周几是从周天的0开始算所以返回数据需要减1
*
* @param objects
* @return
*/
@Override
public DataType weekDay(Object... objects) {
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("WEEKDAY", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int weekDay = 0;
try {
weekDay = getDateTimeValue(date, "DW", "WEEKDAY");
} catch (ParseException e) {
logger.error("err", e);
}
return new DataType(DataType.NUMBER, weekDay > 0 ? (weekDay - 1) : weekDay);
}
@Override
public DataType dayOfMonth(Object... objects) {
String dayType = "";
if (objects != null && objects.length > 0 && objects[0] != null) {
dayType = objects[0].toString();
}
// 获取当前年份、月份、日期
Calendar cale = null;
// 获取当月第一天和最后一天
SimpleDateFormat formatTemp = new SimpleDateFormat("yyyy-MM-dd HH:mm");
String firstday = "", lastday = "";
String date = "";
switch (dayType.toLowerCase()) {
case "first":
// 获取当前月的第一天
cale = Calendar.getInstance();
cale.add(Calendar.MONTH, 0);
cale.set(Calendar.DAY_OF_MONTH, 1);
cale.set(Calendar.HOUR_OF_DAY, 0);
cale.set(Calendar.MINUTE, 0);
firstday = formatTemp.format(cale.getTime());
date = firstday;
break;
case "last":
// 获取当前月的最后一天
cale = Calendar.getInstance();
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, 0);
cale.set(Calendar.HOUR_OF_DAY, 0);
cale.set(Calendar.MINUTE, 0);
lastday = formatTemp.format(cale.getTime());
date = lastday;
break;
default:
// 获取指定的某一天
if (dayType == null || dayType.trim().equalsIgnoreCase("")) {
dayType = "0";
}
cale = Calendar.getInstance();
cale.add(Calendar.MONTH, 1);
cale.set(Calendar.DAY_OF_MONTH, Integer.parseInt(dayType));
cale.set(Calendar.HOUR_OF_DAY, 0);
cale.set(Calendar.MINUTE, 0);
lastday = formatTemp.format(cale.getTime());
date = lastday;
break;
}
return new DataType(DataType.STRING, date);
}
@Override
public DataType monthOfYear(Object... objects) {
String dayType = "";
if (objects != null && objects.length > 0 && objects[0] != null) {
dayType = objects[0].toString();
}
if (dayType == null || dayType.equalsIgnoreCase("")) {
dayType = "0";
}
int month = Integer.parseInt(dayType);
if (month > 0) {
month -= 1;
}
SimpleDateFormat formatTemp = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Calendar cale = Calendar.getInstance();
cale.set(cale.get(Calendar.YEAR), month, 1);
String lastday = formatTemp.format(cale.getTime());
System.out.println(lastday);
return new DataType(DataType.STRING, lastday);
}
@Override
public DataType timeOfDay(Object... objects) {
String dayType = "";
if (objects != null && objects.length > 0 && objects[0] != null) {
dayType = objects[0].toString();
}
SimpleDateFormat dayFormatTemp = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat formatTemp = new SimpleDateFormat("HH:mm");
Calendar cale = Calendar.getInstance();
try {
cale.setTime(new Date());
} catch (Exception e) {
logger.error("err", e);
}
cale.set(Calendar.HOUR_OF_DAY, Integer.parseInt(dayType));
cale.set(Calendar.MINUTE, 0);
String lastday = formatTemp.format(cale.getTime());
return new DataType(DataType.STRING, lastday);
}
@Override
public DataType eoMonth(Object... objects) {
Object result = "";
//校验
Class[] typeObjects = new Class[]{DateAndString.class, Integer.class};
IgnoreParamFilter.commonFilter("EOMONTH", 1, 2, typeObjects, objects);
//获取日期和加减参数
Object dateObj = objects[0];
Object dateContent = dateObj != null ? DateUtil.getContent(dateObj, formatter) : null;
Object tempObj = objects.length > 1 ? objects[1] : null;
Object numObj = tempObj != null && ExcelParamUtil.getParamContent(tempObj, "") != null ? ExcelParamUtil.getParamContent(tempObj, "").toString() : null;
int num = numObj != null ? Integer.parseInt(numObj + "") : 0;
if (ExcelParamUtil.checkIsNull(dateContent, ExcelParamUtil.CHECKLEVEL_STRING)) {
throw new RuntimeException("日期参数不能为空");
}
try {
Date date = null;
if (dateContent instanceof String || dateContent instanceof Character) {
format = DateUtil.buildFormat(dateContent.toString());
if (null == format) {
return null;
}
date = formateDateStr(dateContent.toString(), format);
} else {
date = (Date) dateContent;
}
//在传入日期上进行月份加减操作,并设置为当月第一天
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, num);
cal.set(Calendar.DAY_OF_MONTH, 1);
//取该月最后一天
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
Date newDate = cal.getTime();
result = formateDateStr(newDate, format);
} catch (ParseException e) {
logger.error("eoMonth执行出错:" + e.getMessage(), e);
}
return new DataType(DataType.STRING, result);
}
// @Override
// public DataType workdayIntl(Object... objects) {
// //校验
// Object result = null;
// IgnoreParamFilter.commonFilter("NETWORKDAYSPI", 3, 3, null, objects);
//
// //获取开始日期
// Object startObj = objects[0];
// Object startDateObj = startObj != null ? DateUtil.getContent(startObj, formatter) : null;
//
// Date startDate = null;
// if (startDateObj != null) {
//
// if (startDateObj instanceof String || startDateObj instanceof Character) {
// format = DateUtil.buildFormat(startDateObj.toString());
// if (null == format) {
// logger.error("workdayIntl函数执行时,开始时间获取format为空已返回null");
// return null;
// }
// startDate = formateDateStr(startDateObj.toString(), format);
// } else {
// startDate = (Date) startDateObj;
// }
// }
//
// //结束日期
// Object endObj = objects[1];
// Object endDateObj = endObj != null ? DateUtil.getContent(endObj, formatter) : null;
//
// Date endDate = null;
// if (endDateObj != null) {
//
// if (endDateObj instanceof String || endDateObj instanceof Character) {
// format = DateUtil.buildFormat(endDateObj.toString());
// if (null == format) {
// logger.error("workdayIntl函数执行时,结束时间获取format为空已返回null");
// return null;
// }
// endDate = formateDateStr(endDateObj.toString(), format);
// } else {
// endDate = (Date) endDateObj;
// }
// }
//
// //人员参数
// Object employeeObj = objects[2];
// String empIdStr = employeeObj != null ? ((DataType) employeeObj).getContent() + "" : null;
//
// DataCollectionEmployee currEmp = employeeObj != null ? ((DataType) employeeObj).getEmployee() : null;
// String tenantKey = currEmp != null ? currEmp.getTenantKey() : null;
//
// if (ExcelParamUtil.checkIsNull(startDate, endDate, empIdStr, ExcelParamUtil.CHECKLEVEL_STRING)) {
// throw new RuntimeException("NETWORKDAYSPI函数参数不能为空");
// }
//
// if (StringUtils.isEmpty(tenantKey)) {
// logger.error("workdayIntl函数执行时,tenantKey,已返回null");
// return null;
// }
//
// //结果是否取相反数
// boolean isOpposite = false;
// Date begin = startDate;
// Date end = endDate;
//
// if (startDate.after(end)) {
// isOpposite = true;
// begin = endDate;
// end = startDate;
// }
//
// //结束时间临界值为昨天23:59:59
// Date yesterdayEnd = new Date();
// yesterdayEnd = DateUtils.addDays(yesterdayEnd, -1);
// yesterdayEnd = com.weaver.teams.util.DateUtils.setTimeToEndOfDay(yesterdayEnd);
//
// //最小时间大于昨天最后一刻则计算结果为0
// if (begin.after(yesterdayEnd)) {
// return new DataType(DataType.NUMBER, 0);
// }
// //最大日期大于昨天最后一刻,另结束时间等于昨天最后一刻
// if (end.after(yesterdayEnd)) {
// end = yesterdayEnd;
// }
//
// //间隔天数
// int workDays = 0;
// //是否购买了考勤模块
// boolean attendPay = tenantHttpInvokerService.isPayModule(tenantKey, TenantModuleType.attend);
//
// if (attendPay) {
// //按考勤规则设置来
// Long empId = Long.parseLong(empIdStr);
// Map<Long, Map<String, AttendDayType>> tempMap = null;
//
// try {
// WeaverSentinelContext.setDowngradeType(false);
// tempMap = remoteAttendService.queryDayType(Lists.newArrayList(empId), begin, end, tenantKey);
// } catch (Exception e) {
// if (WeaverDubboSentinelUtil.isRpcNoProviderException(e)) {
// //降级逻辑编写
// logger.info("******workdayIntl的remoteAttendService.queryDayType走了weaver-common-excel-formula中的降级******");
// return new DataType(DataType.NUMBER, 0);
// } else {
// logger.error("workdayIntl的remoteAttendService.queryDayType查询出错:" + e.getMessage());
// }
// }
//
// if (MapUtils.isNotEmpty(tempMap)) {
// Map<String, AttendDayType> dayTypeMap = tempMap.get(empId);
// if (MapUtils.isEmpty(dayTypeMap)) {
// dayTypeMap = Maps.newHashMap();
// }
//
// Date attendDate = null;
// AttendDayType dayType = null;
// int days = DateUtil.daysBetween(begin, end);
//
// //计算工作日天数
// for (int i = 0; i <= days; i++) {
// attendDate = DateUtils.addDays(begin, i);
// String dayStr = DateFormatUtils.format(attendDate, "yyyy-MM-dd");
//
// dayType = dayTypeMap.get(dayStr);
// if (dayType != null && dayType == AttendDayType.WORK) {
// workDays++;
// }
// }
// }
// } else {
// //按法定节假日算
// List<String> tempHolidays = Lists.newArrayList();
// List<Attend4FormDay> holidays = null;
//
// try {
// WeaverSentinelContext.setDowngradeType(false);
// holidays = remoteAttend4FormService.queryDefaultHoliday(begin, end);
// } catch (Exception e) {
// if (WeaverDubboSentinelUtil.isRpcNoProviderException(e)) {
// //降级逻辑编写
// logger.info("******workdayIntl的remoteAttend4FormService.queryDefaultHoliday走了weaver-common-excel-formula中的降级******");
// return new DataType(DataType.NUMBER, 0);
// } else {
// logger.error("workdayIntl的remoteAttend4FormService.queryDefaultHoliday查询出错:" + e.getMessage());
// }
// }
//
// if (CollectionUtils.isNotEmpty(holidays)) {
// for (Attend4FormDay tempDay : holidays) {
// String dayStr = DateFormatUtils.format(tempDay.getDay(), "yyyy-MM-dd");
// tempHolidays.add(dayStr);
// }
// }
//
// Date attendDate = null;
// Calendar cal = Calendar.getInstance();
// int days = DateUtil.daysBetween(begin, end);
//
// //计算工作日天数
// for (int i = 0; i <= days; i++) {
// attendDate = DateUtils.addDays(begin, i);
// String dayStr = DateFormatUtils.format(attendDate, "yyyy-MM-dd");
//
// //节假日
// if (tempHolidays.contains(dayStr)) {
// continue;
// }
//
// //周末
// cal.setTime(attendDate);
// if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
// continue;
// }
//
// //工作日
// workDays++;
// }
// }
// if (isOpposite) {
// workDays = workDays * (-1);
// }
//
// logger.info("workdayIntl计算结果:" + workDays);
// return new DataType(DataType.NUMBER, workDays);
//
// }
@Override
public DataType maxDate(Object... objects) {
Object dateObj = null;
Date date = null;
Date maxDate = null;
//取最大日期
for (int i = 0; i < objects.length; i++) {
dateObj = objects[i];
if (dateObj == null) continue;
//如果类型是DataType
if (dateObj instanceof DataType) {
DataType dataType = (DataType) dateObj;
dateObj = dataType.getContent();
}
if (dateObj == null) continue;
//字符串或Date强转
if (dateObj instanceof String || dateObj instanceof Character) {
String format = DateUtil.buildFormat(dateObj.toString());
if (StringUtils.isNotEmpty(format)) date = formateDateStr(dateObj.toString(), format);
} else {
date = (Date) dateObj;
}
if (date != null && (maxDate == null || date.after(maxDate))) maxDate = date;
}
//日期格式化
String rtnStr = maxDate != null ? DateFormatUtils.format(maxDate, "yyyy-MM-dd") : "";
return new DataType(DataType.STRING, rtnStr);
}
@Override
public DataType minDate(Object... objects) {
Object dateObj = null;
Date date = null;
Date minDate = null;
//取最小日期
for (int i = 0; i < objects.length; i++) {
dateObj = objects[i];
if (dateObj == null) continue;
//如果类型是DataType
if (dateObj instanceof DataType) {
DataType dataType = (DataType) dateObj;
dateObj = dataType.getContent();
}
if (dateObj == null) continue;
if (dateObj instanceof String || dateObj instanceof Character) {
String format = DateUtil.buildFormat(dateObj.toString());
if (StringUtils.isNotEmpty(format)) date = formateDateStr(dateObj.toString(), format);
} else {
date = (Date) dateObj;
}
if (date != null && (minDate == null || date.before(minDate))) minDate = date;
}
//日期格式化
String rtnStr = minDate != null ? DateFormatUtils.format(minDate, "yyyy-MM-dd") : "";
return new DataType(DataType.STRING, rtnStr);
}
@Override
public DataType compareDate(Object... objects) {
Date first = null;
Date second = null;
Object paramObj = objects[0];
Object paramObjSecond = objects[1];
if (paramObj instanceof DataType) {
DataType dataType = (DataType) paramObj;
if (dataType.getContent() != null && StringUtils.isNotEmpty(dataType.getContent() + "")) {
boolean isDate = DateUtil.isDateComponent(paramObj);
if (isDate) {
first = DateUtil.buildDateByDateChar(dataType.getContent() + "");
}
}
} else {
first = DateUtil.buildDateByDateChar(paramObj + "");
}
if (paramObjSecond instanceof DataType) {
DataType dataType = (DataType) paramObjSecond;
if (dataType.getContent() != null && StringUtils.isNotEmpty(dataType.getContent() + "")) {
boolean isDate = DateUtil.isDateComponent(paramObjSecond);
if (isDate) {
second = DateUtil.buildDateByDateChar(dataType.getContent() + "");
}
}
} else {
second = DateUtil.buildDateByDateChar(paramObjSecond + "");
}
if (first == null || second == null) {
return new DataType(DataType.BOOL, false);
}
if (first.getTime() - second.getTime() != 0) {
return new DataType(DataType.BOOL, false);
} else {
return new DataType(DataType.BOOL, true);
}
}
@Override
public DataType currYear(Object... objects) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.YEAR);
return new DataType(DataType.NUMBER, year);
}
@Override
public DataType currMonth(Object... objects) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.MONTH) + 1;
return new DataType(DataType.NUMBER, year);
}
@Override
public DataType currDay(Object... objects) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.DAY_OF_MONTH);
return new DataType(DataType.NUMBER, year);
}
@Override
public DataType currWeek(Object... objects) {
int weekDay = 0;
try {
weekDay = getDateTimeValue(new Date(), "DW", "WEEKDAY");
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return new DataType(DataType.NUMBER, weekDay > 0 ? (weekDay - 1) : weekDay);
}
@Override
public DataType currHour(Object... objects) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.HOUR_OF_DAY);
return new DataType(DataType.NUMBER, year);
}
@Override
public DataType currMinute(Object... objects) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.MINUTE);
return new DataType(DataType.NUMBER, year);
}
@Override
public DataType currSecond(Object... objects) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.SECOND);
return new DataType(DataType.NUMBER, year);
}
@Override
public DataType daysInMonth(Object... objects) {
Class[] typeObjects = new Class[]{DateAndString.class};
IgnoreParamFilter.commonFilter("YEAR", 1, 1, typeObjects, objects);
Object obj = objects[0];
Object date = DateUtil.getContent(obj, formatter);
if (ExcelParamUtil.checkIsNull(date, ExcelParamUtil.CHECKLEVEL_STRING)) {
return new DataType(DataType.NUMBER, 0);
}
int year = 0;
try {
year = getDateTimeValue(date, "Y", "YEAR");
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
IgnoreParamFilter.commonFilter("MONTH", 1, 1, typeObjects, objects);
int month = 0;
try {
month = getDateTimeValue(date, "M", "MONTH") + 1;
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
YearMonth yearMonth = YearMonth.of(year, month);
int daysInMonth = yearMonth.lengthOfMonth();
return new DataType(DataType.NUMBER, daysInMonth);
}
/*******以下为日期函数的一些公共逻辑********/
/**
* 获取日期时间的单位值指定类型为Type默认为 'D' 天数
*
* @param date
* @param type
* @return
* @throws ParseException
*/
public Integer getDateTimeValue(Object date, String type, String func) throws ParseException {
int result = 0;
try {
boolean isTime = false;
Date fDate = null;
if (date instanceof String) {
boolean isDate = checkDateString(date != null ? date.toString() : "");
if (!isDate) {
return 0;
}
format = DateUtil.buildFormat(date.toString(), type);
if (format == null) {
format = DateUtil.buildFormat(date.toString());
}
fDate = formateDateStr(date.toString(), format);
if (date.toString().indexOf(":") > 0 && date.toString().indexOf("-") < 0) {
isTime = true;
if (!type.equals("H") && !type.equals("I") && !type.equals("S")) {
Integer number = IgnoreParamFilter.getSetFuncNumber(func);
JSONObject errorJson = ErrorUtil.buildError(func, number, number, func + "函数参数错误");
throw new RuntimeException(errorJson.getString("msg"));
}
}
} else {
fDate = (Date) date;
}
int calendarType = 0;
switch (type) {
case "Y":
calendarType = Calendar.YEAR;
break;
case "M":
calendarType = Calendar.MONTH;
break;
case "D":
calendarType = Calendar.DAY_OF_MONTH;
break;
case "H":
if (isTime) {
return Integer.parseInt(date.toString().split(":")[0]);
}
calendarType = Calendar.HOUR_OF_DAY;
break;
case "I":
if (isTime) {
return Integer.parseInt(date.toString().split(":")[1]);
}
calendarType = Calendar.MINUTE;
break;
case "S":
if (isTime) {
return Integer.parseInt(date.toString().split(":")[2]);
}
calendarType = Calendar.SECOND;
break;
case "WM":
calendarType = Calendar.WEEK_OF_YEAR;
long startTime1 = fDate.getTime();
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.SUNDAY);//设置星期一为一周开始的第一天
calendar.setMinimalDaysInFirstWeek(4);//可以不用设置
calendar.setTimeInMillis(startTime1);//获得当前的时间戳
int weekOfYear = calendar.get(calendarType);//获得当前日期属于今年的第几周
result = weekOfYear;
logger.info("当前是第" + result + "");
return result;
case "DW":
calendarType = Calendar.DAY_OF_WEEK;
break;
default:
calendarType = Calendar.HOUR_OF_DAY;
break;
}
calendar.setTime(fDate);
result = calendar.get(calendarType);
} catch (RuntimeException e) {
logger.error("err", e);
result = 0;
}
return result;
}
/**
* 格式化日期时间
*
* @param dateStr 日期时间原字符串
* @param format 格式
* @return
* @throws ParseException
*/
private Date formateDateStr(String dateStr, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date ndate = null;
try {
ndate = sdf.parse(dateStr);
} catch (ParseException e) {
logger.error("err", e);
throw new RuntimeException(e);
}
return ndate;
}
/**
* 格式日期时间为字符串
*
* @param date
* @param format
* @return
* @throws ParseException
*/
private String formateDateStr(Date date, String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
String ndate = sdf.format(date);
return ndate;
}
/**
* 判断时间间距的单位类型
*
* @param type
* @return
*/
private Long buildSecondsFmt(String type) {
Long secondsL = null;
switch (type) {
case "Y":
secondsL = (long) (365.25 * 24 * 60 * 60 * 1000);
break;
case "M":
secondsL = (long) (30.4375 * 24 * 60 * 60 * 1000);
break;
case "D":
secondsL = (long) (24 * 60 * 60 * 1000);
break;
case "H":
secondsL = (long) (60 * 60 * 1000);
break;
case "I":
secondsL = (long) (60 * 1000);
break;
case "S":
secondsL = 1000L;
break;
default:
secondsL = (long) (60 * 60 * 1000);
break;
}
return secondsL;
}
static Calendar calendar2 = Calendar.getInstance();
public static SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
static String format2 = "yyyy-MM-dd HH:mm:ss";
public static Integer getDateTimeValue2(Object date, String type, String func) throws ParseException {
int result = 0;
boolean isTime = false;
Date fDate = null;
if (date instanceof String) {
format2 = DateUtil.buildFormat(date.toString());
fDate = formateDateStr2(date.toString(), format2);
if (date.toString().indexOf(":") > 0 && !date.toString().contains("-")) {
isTime = true;
if (!type.equals("H") && !type.equals("I") && !type.equals("S")) {
Integer number = IgnoreParamFilter.getSetFuncNumber(func);
JSONObject errorJson = ErrorUtil.buildError(func, number, number, func + "函数参数错误");
throw new RuntimeException(errorJson.getString("msg"));
}
}
} else {
fDate = (Date) date;
}
int calendarType = 0;
switch (type) {
case "Y":
calendarType = Calendar.YEAR;
break;
case "M":
calendarType = Calendar.MONTH;
break;
case "D":
calendarType = Calendar.DAY_OF_MONTH;
break;
case "H":
if (isTime) {
return Integer.parseInt(date.toString().split(":")[0]);
}
calendarType = Calendar.HOUR_OF_DAY;
break;
case "I":
if (isTime) {
return Integer.parseInt(date.toString().split(":")[1]);
}
calendarType = Calendar.MINUTE;
break;
case "S":
if (isTime) {
return Integer.parseInt(date.toString().split(":")[2]);
}
calendarType = Calendar.SECOND;
break;
case "WM":
calendarType = Calendar.WEEK_OF_MONTH;
break;
case "DW":
calendarType = Calendar.DAY_OF_WEEK;
break;
default:
calendarType = Calendar.HOUR_OF_DAY;
break;
}
calendar2.setTime(fDate);
result = calendar2.get(calendarType);
return result;
}
private static Date formateDateStr2(String dateStr, String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date ndate = null;
ndate = sdf.parse(dateStr);
return ndate;
}
private boolean checkDateString(String dateString) {
List<String> datafList = new ArrayList<String>();
datafList.add("yyyyMMddHHmmss");
datafList.add("yyyyMMdd");
datafList.add("yyyyMMddHHmm");
datafList.add("HH:mm");
datafList.add("HH:mm:ss");
if (RegularUtil.isNumber(dateString)) {
return false;
}
boolean r = false;
for (String s : datafList) {
SimpleDateFormat sdf = new SimpleDateFormat(s);
Date ndate = null;
try {
ndate = sdf.parse(dateString);
r = true;
break;
} catch (ParseException e) {
logger.error(e.getMessage());
r = false;
}
}
if (r) {
if (RegularUtil.isNumber(dateString)) {
r = false;
}
}
return r;
}
public static double getBetween(String beginTime, String endTime, String returnPattern) throws ParseException {
String format = DateUtil.buildFormat(beginTime);
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date beginDate = sdf.parse(beginTime);
format = DateUtil.buildFormat(endTime);
sdf = new SimpleDateFormat(format);
Date endDate = sdf.parse(endTime);
Calendar beginCalendar = Calendar.getInstance();
Calendar endCalendar = Calendar.getInstance();
beginCalendar.setTime(beginDate);
endCalendar.setTime(endDate);
double resutl;
switch (returnPattern) {
case "Y":
resutl = DateTimeServiceImpl.getTime(beginDate, endDate) / (24 * 60 * 60 * 1000) / 365.25;
break;
case "M":
resutl = DateTimeServiceImpl.getByField(beginCalendar, endCalendar, Calendar.YEAR) * 12 + DateTimeServiceImpl.getByField(beginCalendar, endCalendar, Calendar.MONTH);
break;
case "D":
resutl = DateTimeServiceImpl.getTime(beginDate, endDate) / (24 * 60 * 60 * 1000);
break;
case "H":
Long nd = new Long(60 * 60 * 1000);
resutl = DateTimeServiceImpl.getTime(beginDate, endDate) / (nd.doubleValue());
break;
case "I":
resutl = DateTimeServiceImpl.getTime(beginDate, endDate) / (60 * 1000);
break;
case "S":
resutl = DateTimeServiceImpl.getTime(beginDate, endDate) / 1000;
break;
default:
resutl = 0L;
break;
}
return resutl;
}
private static Long getByField(Calendar beginCalendar, Calendar endCalendar, int calendarField) {
int r = endCalendar.get(calendarField) - beginCalendar.get(calendarField);
return (long) r;
}
private static long getTime(Date beginDate, Date endDate) {
return endDate.getTime() - beginDate.getTime();
}
// public static void main(String[] args) {
// try {
// logger.info(DateTimeServiceImpl.getBetween("2017-05-02 22:00:00", "2016-10-02 23:15:00", "Y"));
// } catch (ParseException e) {
// logger.error("err",e);
// }
//
// }
}