import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List; /**
* 节假日工作时间处理
* 假日只处理今年、去年的 1.1、5.1、10.1,和周末
*/
public class HolidayUtil { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static List<String> holidays = new ArrayList<String>(); /**
* 静态块初始化法定节日
*/
static {
Calendar c = Calendar.getInstance();
holidays.add(c.get(Calendar.YEAR)-1 + "-01-01");
holidays.add(c.get(Calendar.YEAR)-1 + "-05-01");
holidays.add(c.get(Calendar.YEAR)-1 + "-10-01");
holidays.add(c.get(Calendar.YEAR) + "-01-01");
holidays.add(c.get(Calendar.YEAR) + "-05-01");
holidays.add(c.get(Calendar.YEAR) + "-10-01");
} /**
* 判断当天是否是节假日 节日只包含1.1;5.1;10.1
*
* @param date 时间
* @return 非工作时间:true;工作时间:false
*/
public static boolean isHolidayOrFestival(Date date) {
boolean result = false;
boolean isHolidayTmp = isHoliday(date);
if (isHolidayTmp) {
result = true;
} else {
Calendar c = Calendar.getInstance();
c.setTime(date);
//周末直接为非工作时间
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY || c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
result = true;
} else {//周内9点到17:30为工作时间
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
if (hour < 9 || (hour == 17 && minute > 30) || hour >= 18) {
result = true;
}
}
}
return result;
} /**
* 非工作时间获取最近的工作时间
* @param date 时间
* @return 返回处理后时间,格式:yyyy-MM-dd HH:mm:ss
*/
public static String getPreWorkDay(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
if (!isHolidayOrFestival(date)) {
return datechange(date, "yyyy-MM-dd HH:mm:ss");
}
//如果是周日最近的工作日为周五,日期减去2
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
c.add(Calendar.DAY_OF_MONTH, -2);
}
//如果是周六最近的工作日为周五,日期减去1
else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
c.add(Calendar.DAY_OF_MONTH, -1);
}
//如果是周一,并且为早上9点之前,最近的工作日为周五,日期减去3
else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
int hour = c.get(Calendar.HOUR_OF_DAY);
if (hour < 9) {
c.add(Calendar.DAY_OF_MONTH, -3);
}
}else{
int hour = c.get(Calendar.HOUR_OF_DAY);
if (hour < 9) {
c.add(Calendar.DAY_OF_MONTH, -1);
}
}
c.set(Calendar.HOUR_OF_DAY, 17);
c.set(Calendar.MINUTE, 30);
c.set(Calendar.SECOND, 0);
return datechange(c.getTime(), "yyyy-MM-dd HH:mm:ss");
} public static String datechange(Date date, String pattern) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
String demo = sdf.format(date);
return demo;
} /**
* 根据判断当前时间是否是节日
*
* @param date
* 时间
* @return
*/
private static boolean isHoliday(Date date) {
boolean result = false;
String dateStr = sdf.format(date);
if (holidays.size() > 0) {
for (String holiday : holidays) {
if (holiday.equals(dateStr)) {
result = true;
break;
}
}
}
return result;
} public static void main(String[] args) throws ParseException {
String d = "2017-07-20 18:31:58";
System.out.println(getPreWorkDay(sdf1.parse(d)));
}
}

  

java处理节假日和工作时间的工具类的更多相关文章

  1. Java判断不为空的工具类总结

    1.Java判断是否为空的工具类,可以直接使用.包含,String字符串,数组,集合等等. package com.bie.util; import java.util.Collection; imp ...

  2. Java字符串转16 进制工具类Hex.java

    Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...

  3. Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  4. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  5. java.util.Arrays----操作数组的工具类

    java.util.Arrays操作数组的工具类,里面定义了很多操作数组的方法 1.boolean equals(int[] a,int[] b):判断两个数组是否相等. 2.String toStr ...

  6. Java数组操作利器:Arrays工具类

    java.util.Arrays提供大量的工具方法来操作数组,这些方法全是静态方法. 1 便捷创建List public static <T> List<T> asList(T ...

  7. 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API

    ---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...

  8. Java核心知识点学习----线程同步工具类,CyclicBarrier学习

    线程同步工具类,CyclicBarrier日常开发较少涉及,这里只举一个例子,以做备注.N个人一块出去玩,相约去两个地方,CyclicBarrier的主要作用是等待所有人都汇合了,才往下一站出发. 1 ...

  9. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

随机推荐

  1. C++学习书籍评价

    1.C++程序设计-现代方法 本书非常适合学习了C语言基础,想跨步到C++学习的同学,前20章都是C基础的回顾,简直不要太简单,后面的课后习题花了半个小时做完了,没怎么出错,嗯,我的C语言基础还是可以 ...

  2. c数据结构 -- 栈与队列

    栈和队列 ·栈和队列是两种常用的.重要的数据结构 ·栈和队列是限定插入和删除只能在表的“端点”进行的线性表 栈 只能在队尾插入,只能在队尾删除 -- 后进后出 表尾称为栈顶:表头称为栈底 插入元素到栈 ...

  3. MySQL加号+ 的作用

    案例:查询员工名和员工姓,连接成一个字段,并显示为: 姓名 SELECT last_name+first_name AS 姓名 FROM employees;没有报错但姓名一下全是0 Java中的 + ...

  4. [前端] html限制input输入数字和小数

    限制input只能输入数字和小数 html代码 <input type="text" style="width:50px" name="widt ...

  5. 题解【洛谷P1347】排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...

  6. 数据库程序接口——JDBC——初篇——目录

    目录 建立连接 核心对象 Driver DriverManager Connection DataSource 常用功能 第一个程序 C3P0数据源 DBCP数据源 事务之Spring事务 执行SQL ...

  7. python 递归调用 返回值问题

    当使用递归时并有返回值时,调用自身函数时需要加上return语句如下: def daxiao(biao1,biao2):     #判断两个列表的大小,根据里面的元素大小     #如果biao1大于 ...

  8. 快速上手leetcode动态规划题

    快速上手leetcode动态规划题 我现在是初学的状态,在此来记录我的刷题过程,便于以后复习巩固. 我leetcode从动态规划开始刷,语言用的java. 一.了解动态规划 我上网查了一下动态规划,了 ...

  9. ASP.NET Core Web API 路由的有效使用

    ROUTING 在 .NET Core Web API 项目中,我们应该使用属性路由代替传统路由,这是因为属性路由可以帮助我们匹配路由参数名称与 Action 内的实际参数方法.另一个原因是路由参数的 ...

  10. UltraEdit设置打开的文件类型,怎么打开大文本文件

    点击高级,配置,选择文件处理下的临时文件,设置如图即可打开超大文本文件. 补充:视图——显示行号.