`
qinya06
  • 浏览: 595089 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

计算 上一个 工作日的 自定义函数

阅读更多
算法描述

1.获取日期参数,然后自减一
2.判断该日期是否是周末,如果否执行4
3.判断当天是否调整为工作,如果否则执行1
4.判断当前日期是否是节假日,如果是则执行1
5.判断当前日期既不是周末也不是节假日
6.返回当前日期,结束。

配置文件:

形参分为以下两种情况:
引用
1.输入为空,返回当前日期的上一个工作日
2.输入为日期参数,格式:20080503,代表2008年5月三日
读取配置文件输入 working.properties

#work=日期1,说明;日期2,说明;….
work=20080404,五一劳动节;20080501,六一儿童节

#swap = 日期1,调整类型,说明;日期2,调整类型,说明;…

#调整类型分为0,1,其中0代表当天工作,1代表当天休息
#比如,五一调整到2号休息:20080501,0,五一继续上班;20080502,1,2号休息
swap=20080501,0,五一继续上班;20080502,1,2号休息


public class GetWorkingDays extends Function {
// 当前日期
private Date date;
@Override
public Object calculate(Context context, boolean inputValue) {
// 日期格式化
SimpleDateFormat sdf = new SimpleDateFormat(”yyyyMMdd”);
// 读取配置文件
....
String work = WorkUtils.getWork();
String swap = WorkUtils.getSwap();
// 条件结果定义
boolean result1 = false;
boolean result2 = false;

// 获取参数定义
if (this.paramList.size() < 1)
this.date = new Date();
else {
Expression exp = (Expression) this.paramList.get(0);
String dateParam = (String) Variant2.getValue(exp.calculate(
context, inputValue), false, false);
try {
this.date = sdf.parse(dateParam);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

System.out.println(”当前日期为:” + sdf.format(date));
// 通过Calendar来进行日期减一运算
Calendar cd = Calendar.getInstance();
cd.setTime(date);
// 做循环直到找到合适的日期
while (true) {
cd.add(Calendar.DATE, -1);
date = cd.getTime();
System.out.println(”日期:” + sdf.format(date) + “;星期”
+ (cd.get(Calendar.DAY_OF_WEEK) - 1) % 7);
// 判断当天是否是周末
result1 = this.isWeekEnd(date, swap);
// 判断当天是否是节假日
result2 = this.isWorkDays(date, work);
//即不是节假日也不是周末,那么确定日期
if (result1 == false && result2 == false)
break;
}
return date;
}

/**
* 判断是否是周末
*
* @param date
* @return
*/
public boolean isWeekEnd(Date date, String swap) {
boolean flag = false;
Calendar c = Calendar.getInstance();
c.setTime(date);
// 判断是否是周末
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY
|| c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { // 判断是否存在”调整为上班的周末”的列表
System.out.println(”该天为周末”);
if (!this.isSwap(date, swap))
{ System.out.println(”该周末调整为上班!”);
flag = true;
}
}
return flag;
}

/**
* 判断是否是休假日期
*
* @param days
* @return
*/
public boolean isWorkDays(Date day, String workdays) {
boolean flag = false;
// 获取休假日列表
String[] temp = workdays.split(”;”);
for (int i = 0; i < temp.length; i++) {
String[] work = temp[i].split(”,”);
work = this.caluWork(work);
try {
if (this.dateCompareTo(day, work[1], work[2])) {
flag = true;
System.out.println(”该天是法定节假日!”);
break;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}
/**
* 对work参数进行处理
* @param work
* @return
*/
public String[] caluWork(String[] work) {
String[] temp = new String[3];
if (work.length <= 2) {
temp[0] = work[0];
temp[1] = work[1];
temp[2] = work[1];
} else
temp = work;
return temp;
}

/**
* 判断当天的调整情况,如果调整为工作,返回true,否则返回false 如果调整列表没有这个日期视为当天工作,返回true
*
* @param days
* @return
*/
public boolean isSwap(Date day, String swapdays) {
boolean flag = false;
// 获取日期调整列表
String[] temp = swapdays.split(”,”);
for (int i = 0; i < temp.length; i++) {
try {
if (temp[i].equals(this.parseDate(day))) {
flag = true;
break;
}
} catch (ParseException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
return flag;
}

/**
* 日期类型转化为字符串
*
* @param temp
* @return
* @throws ParseException
*/
public String parseDate(Date date) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(”yyyyMMdd”);
return sdf.format(date);
}
/**
* 日期区间比较
*
* @param date
* @param begin
* @param after
* @return
* @throws ParseException
*/
public boolean dateCompareTo(Date date, String begin, String end)
throws ParseException {
boolean flag = false;
SimpleDateFormat sdf = new SimpleDateFormat(”yyyyMMddHHmmss”);
begin = begin + “000000″;
end = end + “235959″;
Date date1 = sdf.parse(begin);
Date date2 = sdf.parse(end);
flag = ((date.after(date1)) && (date.before(date2))
|| date.equals(date1) || date.equals(date2));
return flag;
}

}






WorkUtils.java:

package com.runqian.mis.util;
import java.util.*;
public class WorkUtils {
private static final String OPTION_FILE_NAME=”work”;
private static String working;
private static String swap;
/**
* 初始化
*/
static{
ResourceBundle rb = ResourceBundle.getBundle(OPTION_FILE_NAME,locale);
working = rb.getString(”work”).trim();
swap = rb.getString(”swap”).trim();
}
/**
* 获取节假日
* @return
*/
public static String getWork()
{

return working;
}
/**
* 获取假期调整
* @return
*/
public static String getSwap()
{

return swap;
}
}


引用
函数使用

1,把类和配置文件放到设计器的%reportHome%\designer\WEB-INF\classes
目录或者应用的%WEB-INF%\classes目录
2,修改customFunctions.properties文件添加自定义函数
getWorkingDays=0,com.runqian.mis.util.GetWorkingDays
分享到:
评论

相关推荐

    Excel-165个VBA自定义函数大全

    此函数计算两个日期之间的有效工作日数量,排除了周末和节假日,对于项目管理和资源调度非常有用。 #### 18. 英文字符串反转 字符串反转是数据处理中的基础操作之一,对于测试、加密或特殊格式要求的应用场景不可或...

    Excel VBA_自定义函数集.doc

    在Excel VBA中,自定义函数是通过编程的方式扩展Excel内置功能的一种方法,可以实现一些特定的计算或逻辑处理。以下三个自定义函数分别用于不同的功能: 1. 求得指定年月第几个星期几的日期: `Function xqrq...

    基于Excel VBA测绘数据处理自定义函数的开发.pdf

    例如,一个接受单元格区域作为参数的自定义函数,其参数类型应为Range,使用ForEach-Next构造语句可以遍历单元格区域中的每一个元素进行操作。 作者还在文中提到,Excel VBA自定义函数不仅方便接收单元格(区域)的...

    VBA-自定义函数大全

    VBA 自定义函数大全是一组功能强大且实用的函数集合,涵盖了多个领域的应用,包括字符串处理、日期计算、财务计算、汉字处理等。下面是对每个函数的详细说明: 1. 函数作用:返回 Column 英文字 该函数可以将Excel...

    VBA_Excel自定义函数大全

    - **应用场景**:适用于需要精确计算工作日的情况,如项目管理等。 17. **函数作用:将英文字反转的自定函数** - **说明**:此函数可以将英文字符串逆序排列。 - **应用场景**:适用于字符串操作,如密码加密等...

    MySql 是否工作日判断,得到T+n个工作日(含自定义节假日)函数

    2、Mysql 得到T+n个工作日日期(带自定义节假日、法定节假日) fGetWorkDay('2018-02-13', 5) ------------------------------ 2018-02-26 fGetWorkDay('2018-09-26', 5) ------------------------------ 2018-...

    word版160多个VBA自定义函数大全

    本资源提供了 160 多个 Word 版 VBA 自定义函数大全,涵盖了各种实用功能,例如字符串处理、日期计算、财务计算、身份证号码侦测等等。这些函数可以直接复制到 Excel 中使用,极大地提高工作效率。 以下是这些函数...

    收集整理的SQL Server自定义函数

    23.计算两个日期之间的工作日 43 24.根据年月生成日历函数 44 25.从第一个汉字开始分割字符串 47 26.过滤掉字符串中重复的字符 47 27.根据日期得到星期的函数 48 28.根据年度判断是否是闰年 49 29.完善SQL农历转换...

    excel中161个VBA_自定义函数超级实用

    函数作用:在多个工作表中查找一个范围内符合某个指定条件的项目对应指定范围加总求和..........................59 '35.函数作用:返回 Column 英文字.......................60 '36.函数作用:查找指定列名的列数.......

    oracle函数得到下一个法定工作日期

    一个简单的方法是通过创建一个包含所有公休日(如新年、春节、国庆等)的表,然后查询这个表以确定下一个非节假日的工作日。下面是一个可能的表结构: ```sql CREATE TABLE holidays ( holiday_date DATE PRIMARY ...

    我整理的VBA 自定义函数大全 共138页

    20.一个能计算是否有重复单元的函数 21.数字金额转中文大写 22.将数字转成英文 23.人民币大小写转换 24.获取区域颜色值 25.获取活动工作表名 26.获取最后一行行数 27.判断是否连接在线 28.币种转换 29.检验工作表...

    OA中自定义计算工作日函数

    【泛微E9】OA中自定义计算工作日函数

    超级实用的excel的160个VBA自定义函数源代码

    该函数可以计算两个日期之间的差值,但会忽略周末,这在计算工作日差异时非常有用。 11. 函数作用:将英文字反转的自定义函数 此函数将输入的英文字符串进行反转,可以用于文本处理和编码校验。 12. 函数作用:...

    工作日计算函数

    Java开发者可以利用Joda-Time库的WorkingDay类,或者Java 8引入的java.time.chrono.HijrahChronology和java.time.temporal.ChronoField.EASTER_SUNDAY等特性,结合自定义的节假日列表来计算工作日。 在JavaScript中...

    mysql_function_china_workday:MySQL自定义函数,中国法定节假日,计算

    mysql_function_china_workday使用mysql是json函数,通过给每...wokday.sql自定义函数的sql注意未兼容下班后(例如:18:00)算下一个工作日没有0个工作日概念,所以结果+1不支持mysql 5.6版本测试用,勿适用于生产环境

    VBA_自定义函数

    ### VBA自定义函数知识点详解 #### 1. 函数作用:返回Column英文字9 - **函数描述**:此函数用于返回Excel列标对应的英文字符。例如,第1列为"A",第2列为"B",以此类推。 - **应用场景**:常用于构建动态的列引用...

    SQL工作日计算,只排除周末

    在数据库管理和数据分析领域,准确地计算两个日期之间的有效工作日数量是一项非常实用的功能,特别是在需要排除周末(通常指周六和周日)的情况下。这种计算方法对于财务报告、项目管理以及人力资源规划等方面至关...

    计算两个工作日之间的工作日

    在提供的压缩包文件“计算工作日.xlsm”中,很可能是包含了一个使用Excel宏(VBA)编写的模板或应用程序,用于执行上述的计算工作日的功能。使用这类工具,用户可以直接输入起始和结束日期,程序会自动计算并显示...

Global site tag (gtag.js) - Google Analytics