最近公司需要用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写一个算工作日期的功能(考虑到节假日以及补班的情况)相关推荐

  1. 怎样对java网站进行简单修改_用Java写一个简单的毕业设计,功能就增删改查的一些基本功能就可以,需要哪些技术?...

    JAVA实现对吗.我来BB几句吧. 首先,你描述的问题,解决方案是属于java web的知识. 毕设的程度呢.第一种方案: 你可以入手很成熟很成熟的ssm架构.就是Spring+mybatis plu ...

  2. 用Java写一个年薪计算器,助你简单完成大量税前税后总薪计算量

    每个有规模一点的公司都会有会计部门这是毋庸置疑的,但是会计的工作真的如大部分人想的那么简单,只是在每个月的最后几天才忙得不可开交吗 ? 答案当然不是,不然这个岗位早就人满为患了. 目前就我了解到的会计 ...

  3. java实现迷你计算机,用JAVA写一个迷你编辑器.doc

    用JAVA写一个迷你编辑器 用JAVA编写一个迷你编辑器 WINDOWS的记事本程序是非常方便的一个文字处理工具,用它来编辑纯文本文件快捷而灵巧.我用JAVA写了一个编辑器程序,模仿"记事本 ...

  4. 用java写一个日历_使用JAVA写一个简单的日历

    JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...

  5. java编写日历思路_使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDat ...

  6. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDa ...

  7. 用java写一个判断身份验证是否过期

    要用 Java 写一个判断身份验证是否过期,可以使用 Java 的日期和时间 API,例如:java.time 包中的 Instant 类. 首先,需要存储身份验证的创建时间,并在每次请求时与当前时间 ...

  8. 用java写一个简单的区块链(下)

    用java写一个简单的区块链(下) 2018年03月29日 21:44:35 java派大星 阅读数:725 标签: 区块链java 更多 个人分类: 区块链 版权声明:本文为博主原创文章,转载请标明 ...

  9. 怎样用java写一个简单的文件复制程序

    怎样用java写一个简单的文件复制程序 代码来源:https://jingyan.baidu.com/article/c35dbcb0d6f1398916fcbc07.html package Num ...

最新文章

  1. Leetcode 205. 同构字符串 解题思路及C++实现
  2. layui和jquery冲突:Syntax error, unrecognized expression: +
  3. 12种NumpyPandas高效技巧
  4. 时态知识图谱补全的方法及其进展
  5. c语言作业班级管理系统,班级信息管理系统(C语言)
  6. er图转关系模式规则_ER模型到关系模型的转换规则
  7. es - elasticsearch mapping - parameters - norms
  8. jboot_jboot这些框架有意义吗
  9. 论“女生不适合当程序员”
  10. 如何挑选属于自己的电脑
  11. 5个方法将不带www的根域名301重定向到www主域名
  12. 色彩和色调(色相,明度,冷暖,纯度)
  13. linux gadget 模拟鼠标,HID设备--开发板模拟鼠标
  14. python将大文件拆分成多个小文件,同时对各小文件处理以节省时间
  15. 【电脑常用办公软件】万彩办公大师教程丨全能视频转换工具
  16. 南航金城学院计算机网络试卷及答案,南航金城学院期末电路理论基础考试题及答案解析.pdf...
  17. centos小彩蛋—sl命令 跑满屏小火车
  18. android 4g信号强度 300mw,Android TelephonyManager 信号强度
  19. OPPO A1 禁用APP
  20. 《深入分布式缓存》之“分布式理论:CAP是三选二吗?”

热门文章

  1. Excel 2010 VBA 入门 129 利用窗体向工作表中录入数据
  2. 漫画:PHP女程序员自救的技巧
  3. java中String转byte 编码格式
  4. java倒序查询数据库_数据库 倒序查询
  5. C++ 实现mystring类型
  6. ChinaGrid要建8朵“云”
  7. iphone内存管理(一)
  8. 华为在鸿蒙的另一张王牌,麒麟芯成绝唱后,华为终于还是,甩出了另外一张王牌...
  9. 淘宝店铺运营经验分享,影响宝贝转化率的因素有哪些,如何提高转化
  10. 卷积神经网络大盘拐点预测