用java写一个算工作日期的功能(考虑到节假日以及补班的情况)
最近公司需要用java写一个算工作日的功能,简单说说我的实现过程跟思路,以供各位参考,大牛勿喷。
基本思路:在数据库先创建一个表,在表中初始化一年中的假期、需要补班等数据(因为每一年放假、补办安排都不一样,所以每年都要手动初始化数据进去),然后后台接收到开始时间跟结束时间这两个参数,计算出起始时间中的天数,减去法定节假日跟周末(有一点要注意一下,周末跟法定节假日是同一天),再加上补班的天数,这样可得出在一个时间段中,此人究竟上了多少天班。废话不多说了,直接上代码:
1.数据库建表后创建实体类并添加get,set方法:
2.dao层跟service层添加增删改查方法,并在实现类中实现各方法,
可根据业务不同,自行设计相应的方法。
3.直接上模拟debug的方法(本地可直接测试):
public class WorkDayUtilsDebug {
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = sdf.parse("2017-03-19");
Date endDate = sdf.parse("2017-04-19");
List<Date> betweenDates = getBetweenDates(startDate, endDate);
for (int i = 0; i < betweenDates.size(); i++) {
Date date = betweenDates.get(i);
int holidayTypeByDate = getHolidayTypeByDate(date);
// type为-1:则说明在数据库没有匹配到设置,则由程序决定是否为假日
if (holidayTypeByDate == -1) {
// 如果是否为周末,则为节假日
if (isWeekend(date)) {
holidayTypeByDate = 0;
} else {
holidayTypeByDate = 1;
}
}
switch (holidayTypeByDate) {
// 0:即为节假日,则减掉日期
case 0:
System.out.println(sdf.format(date) + "节假日");
betweenDates.remove(i);
i--;
break;
// 1:补班,则加上日期(不用动作处理)
case 1:
break;
}
}
System.out.println(
sdf.format(startDate) + " 至 " + sdf.format(endDate) + ",工作天数为:" + betweenDates.size());
}
/**
* 判断是否是周末
*
* @return
*/
private static boolean isWeekend(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (week == 6 || week == 0) {// 0代表周日,6代表周六
return true;
}
return false;
}
/**
* @Name getHolidayTypeByDate
* @Description 传递日期,获取人工设置表中是为有业务动作
* @Author liusheng
* @Version V1.00
* @CreateDate 2017年3月12日 下午9:52:26
* @param date
* @return 0:即为节假日 1:补班
*/
public static int getHolidayTypeByDate(Date date) {
/* ----------------------test 代码 start ---------------------- */
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
long time = 0;
try {
time = sdf.parse(sdf.format(date)).getTime();
} catch (ParseException e1) {
e1.printStackTrace();
}
// 假设"2017-03-13 2017-03-12" 就是补班
Date startDate = null;
try {
startDate = sdf.parse("2017-03-10");
} catch (ParseException e) {
e.printStackTrace();
}
Date endDate = null;
try {
endDate = sdf.parse("2017-03-12");
} catch (ParseException e) {
e.printStackTrace();
}
if (time >= startDate.getTime() && time <= endDate.getTime()) {
return 1;
}
// 假设"2017-10-01 2017-10-07" 就是补班
try {
startDate = sdf.parse("2017-10-01");
} catch (ParseException e) {
e.printStackTrace();
}
try {
endDate = sdf.parse("2017-10-07");
} catch (ParseException e) {
e.printStackTrace();
}
if (time >= startDate.getTime() && time <= endDate.getTime()) {
return 0;
}
/* ----------------------test 代码 end ---------------------- */
// 查不班就是-1,系统以周末为准
return -1;
}
/**
* 获取两个日期之间的日期
*
* @param start 开始日期
* @param end 结束日期
* @return 日期集合
*/
private static List<Date> getBetweenDates(Date start, Date end) {
List<Date> result = new ArrayList<Date>();
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.add(Calendar.DAY_OF_YEAR, 1);
Calendar tempEnd = Calendar.getInstance();
result.add(start);
tempEnd.setTime(end);
while (tempStart.before(tempEnd)) {
result.add(tempStart.getTime());
tempStart.add(Calendar.DAY_OF_YEAR, 1);
}
result.add(end);
return result;
}
}
用java写一个算工作日期的功能(考虑到节假日以及补班的情况)相关推荐
- 怎样对java网站进行简单修改_用Java写一个简单的毕业设计,功能就增删改查的一些基本功能就可以,需要哪些技术?...
JAVA实现对吗.我来BB几句吧. 首先,你描述的问题,解决方案是属于java web的知识. 毕设的程度呢.第一种方案: 你可以入手很成熟很成熟的ssm架构.就是Spring+mybatis plu ...
- 用Java写一个年薪计算器,助你简单完成大量税前税后总薪计算量
每个有规模一点的公司都会有会计部门这是毋庸置疑的,但是会计的工作真的如大部分人想的那么简单,只是在每个月的最后几天才忙得不可开交吗 ? 答案当然不是,不然这个岗位早就人满为患了. 目前就我了解到的会计 ...
- java实现迷你计算机,用JAVA写一个迷你编辑器.doc
用JAVA写一个迷你编辑器 用JAVA编写一个迷你编辑器 WINDOWS的记事本程序是非常方便的一个文字处理工具,用它来编辑纯文本文件快捷而灵巧.我用JAVA写了一个编辑器程序,模仿"记事本 ...
- 用java写一个日历_使用JAVA写一个简单的日历
JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...
- java编写日历思路_使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDat ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...
- 用java写一个判断身份验证是否过期
要用 Java 写一个判断身份验证是否过期,可以使用 Java 的日期和时间 API,例如:java.time 包中的 Instant 类. 首先,需要存储身份验证的创建时间,并在每次请求时与当前时间 ...
- 用java写一个简单的区块链(下)
用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...
- 怎样用java写一个简单的文件复制程序
怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...
最新文章
- Leetcode 205. 同构字符串 解题思路及C++实现
- layui和jquery冲突:Syntax error, unrecognized expression: +
- 12种NumpyPandas高效技巧
- 时态知识图谱补全的方法及其进展
- c语言作业班级管理系统,班级信息管理系统(C语言)
- er图转关系模式规则_ER模型到关系模型的转换规则
- es - elasticsearch mapping - parameters - norms
- jboot_jboot这些框架有意义吗
- 论“女生不适合当程序员”
- 如何挑选属于自己的电脑
- 5个方法将不带www的根域名301重定向到www主域名
- 色彩和色调(色相,明度,冷暖,纯度)
- linux gadget 模拟鼠标,HID设备--开发板模拟鼠标
- python将大文件拆分成多个小文件,同时对各小文件处理以节省时间
- 【电脑常用办公软件】万彩办公大师教程丨全能视频转换工具
- 南航金城学院计算机网络试卷及答案,南航金城学院期末电路理论基础考试题及答案解析.pdf...
- centos小彩蛋—sl命令 跑满屏小火车
- android 4g信号强度 300mw,Android TelephonyManager 信号强度
- OPPO A1 禁用APP
- 《深入分布式缓存》之“分布式理论:CAP是三选二吗?”
热门文章
- Excel 2010 VBA 入门 129 利用窗体向工作表中录入数据
- 漫画:PHP女程序员自救的技巧
- java中String转byte 编码格式
- java倒序查询数据库_数据库 倒序查询
- C++ 实现mystring类型
- ChinaGrid要建8朵“云”
- iphone内存管理(一)
- 华为在鸿蒙的另一张王牌,麒麟芯成绝唱后,华为终于还是,甩出了另外一张王牌...
- 淘宝店铺运营经验分享,影响宝贝转化率的因素有哪些,如何提高转化
- 卷积神经网络大盘拐点预测