我们需要两个类,第一个类:

  

  我们叫它验证类。

  第二个类:

  

  它是对法定节假日的抽象。

  第一步开始:

  当验证类被初始化的时候,会加载本年的所有法定节假日到一个list里:

  thisYearHolidays.add(new Holiday(元旦)

  .setHolidayRange(LocalDate.now().withMonth(1).withDayOfMonth(1),1)

  );

  thisYearHolidays.add(new Holiday(春节)

  .setHolidayRange(LocalDate.now().withMonth(2).withDayOfMonth(15),7)

  .setWorkDayRange(LocalDate.now().withDayOfMonth(2).withDayOfMonth(11),1)

  .setWorkDayRange(LocalDate.now().withDayOfMonth(2).withDayOfMonth(24),1)

  );

  thisYearHolidays.add(new Holiday(清明)

  .setHolidayRange(LocalDate.now().withMonth(4).withDayOfMonth(5),3)

  .setWorkDayRange(LocalDate.now().withMonth(4).withDayOfMonth(8),1)

  );

  //此处省略...

  那么,Holiday这个类,setHolidayRange与setWorkDayRange这两个函数负责的就是处理法定节假日的休息日与调休日。

  public Holiday setHolidayRange(LocalDate baseDate,int holidays){

  holidayList.add(baseDate);

  for(int i = 1;iholidays;i++){

  holidayList.add(baseDate.plusDays(i));

  }

  return this;

  }

  以上为setHolidayRange代码,setWorkDayRange相似。

  接下来,当我们调用验证类的todayIsHoliday方法时,它会判断当前日期是否为法定节假日的休息日,再判断当前日期是否不在调休日内,最后判断是否是周末,代码如下:

  public boolean todayIsHoliday(){

  LocalDate today=LocalDate.now();

  //首先判断是否是节假日

  if(isHoliday(today)){

  return true;

  }

  //判断不在调休日并且今天是周末

  return !inAdjustDay(today) isWeekend(today);

  }

  其中,这里有两个关键函数:

  predejavu sans= mono= for= powerline= ';font-size:9.0pt;= style=box-sizing: border-box;isHoliday和inAdjustDay:

  isHoliday 原理就是通过循环判断传入的日期是否在法定节假日的休息日列表里:

  private boolean isHoliday(LocalDate date){

  //循环判断date是否在holidayList 里

  for(Holiday holiday:thisYearHolidays){

  if(holiday.isHoliday(date)){

  return true;

  }

  }

  return false;

  }

  而inAdjustDay原理同上:

  private boolean inAdjustDay(LocalDate date){

  for(Holiday holiday:thisYearHolidays){

  if(holiday.inAdjustDay(date)){

  return true;

  }

  }

  return false;

  }

  这里的两个方法又各自调用了Holiday类的接口:

  /*

  * 判断传入的日期是否应该放假

  * */

  public boolean isHoliday(LocalDate date){

  for(LocalDate localDate:holidayList){

  if(localDate.equals(date)){

  return true;

  }

  }

  return false;

  }

  /*

  * 判断传入的日期是否在调休日

  * */

  public boolean inAdjustDay(LocalDate date){

  for(LocalDate localDate:workDayList){

  if(localDate.equals(date)){

  return true;

  }

  }

  return false;

  }

  这两个方法也是通过再次循环判断传入的日期是否在内部所维护的休息日列表或工作日列表,来决定是否是休息日或者是工作日。

谈谈JAVA实现节假日验证的更多相关文章

  1. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  2. 老鸟谈谈JAVA EE的学习

    老鸟谈谈JAVA EE的学习 因为出差和项目的原因,有将近一个月的时间没有更新博客了,今天终于得闲,和兄弟们分享一下JAVA EE的学习心得.书中带过,直入主题,下面我们首先看看什么是JAVA EE. ...

  3. 谈谈Java的集合组件

    让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合 ...

  4. 史上最全Java表单验证封装类

    package com.tongrong.utils; import java.util.Collection; import java.util.Map; import java.util.rege ...

  5. Java的登陆验证问题

    java中的登陆验证问题可以有多种方式进行验证,通过拦截器功能完成,可以通过过滤器功能完成,也可以简单的代码在JSP页面中单独完成,其中都 涉及到一个关键的验证步骤,这个验证原理ASP,PHP,JAV ...

  6. java对身份证验证及正则表达式解析

    原文地址:http://www.cnblogs.com/zhongshengzhen/ java对身份证验证及正则表达式解析 package service; import java.text.Par ...

  7. 微信支付java版V3验证数据合法性

    [TOC] 1. 微信支付java版V3验证数据合法性 概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法. 特别提醒:商户系统对于支付结果通知的内容一定 ...

  8. 谈谈java的BlockingQueue

    http://www.cnblogs.com/archy_yu/archive/2013/04/19/3018479.html 博客园 首页 新随笔 联系 管理 随笔- 92  文章- 0  评论- ...

  9. Java实现邮箱验证

    Java实现邮箱验证 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开 ...

随机推荐

  1. SSM思路大总结(部门信息的显示和增删改查)

    #ssm整合(部门管理) ##1.新建工程 1.新建maven工程 2.添加web.xml 3.添加tomcat运行环境 4.添加依赖jar包 spring-webmvc mysql commonse ...

  2. linux python3 安装scrapy 后提示 -bash: scrapy: 未找到命令

    https://blog.csdn.net/dangsh_/article/details/79613210

  3. PHP结合Vue实现上拉分页

    效果图: <?php if(isset($_GET['data'])){ $data = [ [ 'title'=>1], [ 'title'=>2], [ 'title'=> ...

  4. kafka学习指南(总结版)

    版本介绍 从使用上来看,以0.9为分界线,0.9开始不再区分高级/低级消费者API. 从兼容性上来看,以0.8.x为分界线,0.8.x不兼容以前的版本. 总体拓扑架构 从上可知: 1.生产者不需要访问 ...

  5. UVa Live 3942 Remember the Word - Hash - 动态规划

    题目传送门 高速路出口I 高速路出口II 题目大意 给定若干种短串,和文本串$S$,问有多少种方式可以将短串拼成长串. 显然,你需要一个动态规划. 用$f[i]$表示拼出串$S$前$i$个字符的方案数 ...

  6. Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论

    n people are standing on a coordinate axis in points with positive integer coordinates strictly less ...

  7. Linux 双向 SSH 免密登录

    原理 双向,顾名思义,双方互通,此处的意思是多台 linux 两两免密登录.双向比单向多了些操作,单向只需把某一个linux的公钥发送给其他linux即可,而双向要实现集群中的每一台机器都保存其他所有 ...

  8. 终于知道linux firefox不能播放 web在线词典的单词发音了! --通过banshee安装gstreamer1-libav/-plugins-ugly/plugins-bad三个mp3插件.

    mpg123 是一个 命令行的播放器, 他没有gui界面. 直接用 mpg123 test.mp3 就可以直接播放, 而且, 最终要的是, mpg123 自带了mp3的解码器. mpeg: movin ...

  9. 在fedora23中安装virtualbox, 然后实现虚拟机irtualbox 或者 vmware 下的xp操作系统

    参考: http://blog.csdn.net/statdm/article/details/7756788 参考: http://www.cnblogs.com/fengbohello/p/488 ...

  10. 【Spring Security】四、自定义页面

    在前面例子中,登陆页面都是用的Spring Security自己提供的,这明显不符合实际开发场景,同时也没有退出和注销按钮,因此在每次测试的时候都要通过关闭浏览器来注销达到清除session的效果. ...