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 holidays = new ArrayList();

/**

* 静态块初始化法定节日

*/

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节假日算法_java处理节假日和工作时间的工具类相关推荐

  1. java smart算法_Java Restful API 文档生成工具 smart-doc

    谁说生成api文档就必须要定义注解? 谁说生成接口请求和返回示例必须要在线? 用代码去探路,不断尝试更多文档交付的可能性. 如果代码有生命,为什么不换种方式和它对话! 一.背景 没有背景.就自己做自己 ...

  2. java生日正则表达式_Java编程基础15——正则表达式常用工具类

    1_正则表达式的概述和简单使用 A:正则表达式 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. 作用:比如注册邮箱,邮箱有用户名和密码,一般会 ...

  3. java中集合类的转换_Java中的两个常用工具类及集合数组的相互转换

    为了编程人员的方便及处理数据的安全性,Java特别提供了两个非常有用的工具类: 一.Collections 1.Collections类的特点: 集合框架的工具类.里面定义的都是静态方法. 2.Col ...

  4. java 获取两条经纬度线段的交点坐标工具类

    java 获取两条经纬度线段的交点坐标工具类 网上有线段是否相交的判断方法,但是很少有获取线段交点的坐标的方法 我在这里整合了网上的一些相交的方法,通过相交的xy轴点返推出了经纬度. 拾取坐标系统 可 ...

  5. java 中间容器 表格_【JAVA SE基础篇】45.迭代器、Collections工具类以及使用容器存储表格...

    本文将要为您介绍的是[JAVA SE基础篇]45.迭代器.Collections工具类以及使用容器存储表格,具体完成步骤: 1.迭代器 迭代器为我们提供了统一遍历容器(List/Map/Set)的方式 ...

  6. Java操作大数据量Excel导入导出万能工具类(完整版)

    Java操作大数据量Excel导入导出万能工具类(完整版) 转载自:https://blog.csdn.net/JavaWebRookie/article/details/80843653 更新日志: ...

  7. java des算法_Java DES算法程序

    java des算法 Java Cryptography Extension (JCE) provides framework and implementation for generating ke ...

  8. java 抽奖算法_Java抽奖算法第二例

    本文实例为大家分享了java抽奖算法,供大家参考,具体内容如下 1. 算法分析 根据概率将奖品划分区间,每个区间代表一个奖品,然后抽取随机数,反查落在那个区间上,即为所抽取的奖品. 2. 代码核心算法 ...

  9. java des加密解密_Java实现的DES加密解密工具类实例

    本文实例讲述了Java实现的DES加密解密工具类.分享给大家供大家参考,具体如下: 一个工具类,很常用,不做深入研究了,那来可直接用 DesUtil.java package lsy; import ...

最新文章

  1. 消息中间件客户端消费控制实践
  2. 系统分析与仿真1-单输入单输出质量块+阻尼器系统
  3. Python基础(9)水仙花数
  4. uber在限制新司机加入了,看看新政策把
  5. pytorch 三维点分类_三维点云分类与分割-PointNet
  6. 【Android.mk】android编译系统makefile文件Android.mk的写法
  7. Azure手把手系列6:存储服务介绍
  8. 数学--数论--Hdu 5793 A Boring Question (打表+逆元)
  9. android listpreference 自定义,Android – 我的ListPreference中的自定义行布局
  10. 给不会调用C++STL库中二分函数lower_bound,upper_bound,binary_search同学的一些话!
  11. python读取Excel实例详细教程
  12. 训练日志 2019.1.26
  13. leetcode 只出现一次的数字
  14. Hibernate查询用法总结
  15. python软件下载百度云-python电子书学习资料打包分享百度云资源下载
  16. LinuxC网络编程
  17. editplus软件下载地址
  18. 最强内存稳定性测试软件,内存稳定性测试软件Memtest正式版——HyperX FURY DDR4成绩喜人...
  19. 我为何从开发转测试,并坚持了16年?
  20. arduino最大电压_制作Arduino功率计测量电压电流及功耗

热门文章

  1. ant-design-vue中自定义a-tree的打开与折叠图标
  2. 前端可视化技术-笔记
  3. html实现微信扫一扫,JS 实现微信扫一扫功能
  4. (八)苏世民:我的经验和教训:决策(567)
  5. JAVA IO必会概念
  6. 蓝牙耳机品牌推荐:2023年降噪蓝牙耳机性价比推荐
  7. android --------- Android10系统上访问本地相机下的视频文件报错 /storage/emulated/0/DCIM/Camera/ open failed: EACCES
  8. 职场饭局上被别人夸奖,该如何回复才能不尬场?|智测优聘总结
  9. (39.1)【XML漏洞专题】必备的基础知识、利用原理、构建规则
  10. dva 脚手架目录分析