Java计算加上指定工作日数(排除周六周日和一系列节日)
来源:互联网 发布:mac pro 显卡升级 编辑:程序博客网 时间:2024/05/17 01:27
package com.stocks.util;import android.util.SparseArray;import org.joda.time.DateTime;import java.text.SimpleDateFormat;import java.util.Arrays;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.HashMap;import java.util.List;public class DateUtil { private boolean holidayFlag;// int[][] holidays = {{6, 9}, {6, 10}, {9, 15}, {9, 16}}; HashMap<Integer, List<Integer>> holidays; public void getHolidays() {// List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); if (holidays == null) { holidays = new HashMap<>(); holidays.put(6, Arrays.asList(9, 10)); holidays.put(9, Arrays.asList(15, 16)); holidays.put(1, Arrays.asList(1)); } } /** * 计算工作日, 具体节日包含哪些,可以在HolidayMap中修改 * src =日期(源), adddays 要加的天数 */ public Calendar addDateByWorkDay(Calendar src, int adddays) {// Calendar result = null; holidayFlag = false; for (int i = 0; i < adddays; i++) { //把源日期加一天 src.add(Calendar.DAY_OF_MONTH, 1); holidayFlag = checkHoliday(src); if (holidayFlag) { i--; } System.out.println(src.getTime()); } System.out.println("Final Result:" + src.getTime()); return src; } public String getToday( String format){ if (format == null) { format = "yyyyMMdd"; } DateTime dateTime =new DateTime(); boolean holidayFlag = true; int addday=0; while (holidayFlag) { //把源日期加一天 holidayFlag = checkHolidayJoda(dateTime); if (holidayFlag) { dateTime = dateTime.plusDays(-1); addday++; } } if(addday==0 && dateTime.getHourOfDay()<8){ dateTime=dateTime.plusDays(-1); } String strdate = dateTime.toString(format); return strdate; } public Integer getToday_old(Calendar src, String format) { if (format == null) { format = "yyyyMMdd"; } boolean holidayFlag = true; while (holidayFlag) { //把源日期加一天 holidayFlag = checkHoliday(src); if (holidayFlag) src.add(Calendar.DAY_OF_MONTH, -1); } Date dNow = src.getTime(); SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式 String defaultStartDate = sdf.format(dNow); //格式化前3月的时间 return Integer.parseInt(defaultStartDate);// System.out.println("生成的时间是:" + defaultEndDate); } public int beforeDateByWorkDay(Calendar src, int beforedays, String format) { if (format == null) { format = ("yyyyMMdd"); }// Calendar result = null; boolean holidayFlag = true; while (holidayFlag) { //把源日期加一天 holidayFlag = checkHoliday(src); if (holidayFlag) src.add(Calendar.DAY_OF_MONTH, -1); } for (int i = 0; i < beforedays; i++) { //把源日期加一天 src.add(Calendar.DAY_OF_MONTH, -1); holidayFlag = true; while (holidayFlag) { //把源日期加一天 holidayFlag = checkHoliday(src); if (holidayFlag) src.add(Calendar.DAY_OF_MONTH, -1); } System.out.println(src.getTime()); } System.out.println("Final Result:" + src.getTime()); Date dBefore = src.getTime(); //得到前3月的时间 SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式 String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间 return Integer.parseInt(defaultStartDate); } public int beforeDateByWeek(Calendar src, int beforeweeks, String format) { if (format == null) { format = ("yyyyMMdd"); } src.add(Calendar.WEEK_OF_MONTH, -beforeweeks); src.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); Date dBefore = src.getTime(); //得到前3月的时间 SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式 String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间 return Integer.parseInt(defaultStartDate); } public int beforeDateByMonth(Calendar src, int beforeweeks, String format) { if (format == null) { format = ("yyyyMMdd"); } src.add(Calendar.MONTH, -beforeweeks); System.out.println("Final Result:" + src.getTime()); Date dBefore = src.getTime(); //得到前3月的时间 SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式 String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间 return Integer.parseInt(defaultStartDate); } /** * 校验指定的日期是否在节日列表中 * 具体节日包含哪些,可以在HolidayMap中修改 * @author shenjunjie */ public boolean checkHolidayJoda(DateTime dateTime) { getHolidays(); //先检查是否是周六周日(有些国家是周五周六) if (dateTime.getDayOfWeek() == 6 || dateTime.getDayOfWeek() == 7) { return true; } if (holidays.containsKey(dateTime.getMonthOfYear())) { if (holidays.get(dateTime.getMonthOfYear()).contains(dateTime.getDayOfMonth())) { return true; } } return false; } /** * 校验指定的日期是否在节日列表中 * 具体节日包含哪些,可以在HolidayMap中修改 * * @param src 要校验的日期(源) * @author shenjunjie */ public boolean checkHoliday(Calendar src) { boolean result = false; getHolidays(); //先检查是否是周六周日(有些国家是周五周六) if (src.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || src.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { return true; } if (holidays.containsKey(src.get(Calendar.MONTH)+1)) { if (holidays.get(src.get(Calendar.MONTH)+1).contains(src.get(Calendar.DAY_OF_MONTH))) { return true; } } return false; } /** * 初始化节日List,请在这里添加新的节日 * 加的时候请尽量使用Calendar自带的常量而不是魔鬼数字 * 注:年份可以随便写,因为比的时候只比月份和天 * * @author shenjunjie */// private void initHolidayList() {// holidayList = new SparseArray<>();//// //五一劳动节// Calendar may1 = Calendar.getInstance();// may1.set(Calendar.MONTH, Calendar.MAY);// may1.set(Calendar.DAY_OF_MONTH, 1);// holidayList.put(holidayList.size(), may1);//// Calendar may2 = Calendar.getInstance();// may2.set(Calendar.MONTH, Calendar.MAY);// may2.set(Calendar.DAY_OF_MONTH, 2);// holidayList.put(holidayList.size(), may2);//// Calendar may3 = Calendar.getInstance();// may3.set(Calendar.MONTH, Calendar.MAY);// may3.set(Calendar.DAY_OF_MONTH, 3);// holidayList.put(holidayList.size(), may3);//// Calendar h3 = Calendar.getInstance();// h3.set(2000, 1, 1);// holidayList.put(holidayList.size(), h3);//// Calendar h4 = Calendar.getInstance();// h4.set(2000, 12, 25);// holidayList.put(holidayList.size(), h4);//// //端午节// Calendar h5 = Calendar.getInstance();// h5.set(2000, 6, 9);// holidayList.put(holidayList.size(), h5);// Calendar h6 = Calendar.getInstance();// h6.set(2000, 6, 10);// holidayList.put(holidayList.size(), h6);//// Calendar h7 = Calendar.getInstance();// h7.set(2000, 9, 15);// holidayList.put(holidayList.size(), h7);// Calendar h8 = Calendar.getInstance();// h8.set(2000, 9, 16);// holidayList.put(holidayList.size(), h8);//// //中国母亲节:五月的第二个星期日// Calendar may5 = Calendar.getInstance();// //设置月份为5月// may5.set(Calendar.MONTH, Calendar.MAY);// //设置星期:第2个星期// may5.set(Calendar.DAY_OF_WEEK_IN_MONTH, 2);// //星期日// may5.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);//// System.out.println(may5.getTime());// holidayList.put(holidayList.size(), may5);// } public void testAddDateByWorkDay() { Calendar src = Calendar.getInstance(); src.set(2010, Calendar.APRIL, 29); Calendar result = addDateByWorkDay(src, 2); Calendar expected = Calendar.getInstance(); expected.set(2010, Calendar.MAY, 4);// Assert.assertEquals(expected.getTime().toString(), result.getTime().toString()); } public void testAddDateByWorkDay2() { //测试母亲节 Calendar src = Calendar.getInstance(); src.set(2010, Calendar.MAY, 7); Calendar result = addDateByWorkDay(src, 2); Calendar expected = Calendar.getInstance(); expected.set(2010, Calendar.MAY, 11);// Assert.assertEquals(expected.getTime().toString(), result.getTime().toString()); } /** * 获得所在日期的周五日期 */ public int getFriday(Calendar date, String format) { if (format == null) { format = ("yyyyMMdd"); } date.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); Date dBefore = date.getTime(); //得到前3月的时间 SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式 String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间 return Integer.parseInt(defaultStartDate); } /** * 获得上周五日期 */ public int getLastFriday(Calendar date, String format) { if (format == null) { format = ("yyyyMMdd"); } date.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); date.add(Calendar.DATE, -7); Date dBefore = date.getTime(); //得到前3月的时间 SimpleDateFormat sdf = new SimpleDateFormat(format); //设置时间格式 String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间 return Integer.parseInt(defaultStartDate); } public static void main(String[] args) { Calendar may1 = Calendar.getInstance(); may1.set(Calendar.MONTH, Calendar.JUNE); may1.set(Calendar.DAY_OF_MONTH, 11); String aaa= new DateUtil(). getToday(null); Calendar cal = Calendar.getInstance(); cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); cal.add(Calendar.DATE, -7);// 也可以写成:cal.set(GregorianCalendar.DAY_OF_WEEK,6); Date dBefore = cal.getTime(); //得到前3月的时间 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //设置时间格式 String defaultStartDate = sdf.format(dBefore); //格式化前3月的时间 int aa = Integer.parseInt(defaultStartDate);// src.set(2016, Calendar.APRIL , 1); String date = "20160412"; cal.set(Integer.parseInt(date.substring(0, 4)), Integer.parseInt(date.substring(4, 6)) - 1, Integer.parseInt(date.substring(6, 8))); int maxdate = new DateUtil().getFriday(cal, null); aa = new DateUtil().beforeDateByWorkDay(cal, 60, null); Calendar expected = Calendar.getInstance(); expected.set(2010, Calendar.MAY, 4); }}
0 0
- Java计算加上指定工作日数(排除周六周日和一系列节日)
- oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
- oracle计算一个日期加上指定工作日(排除周六周日和一系列节假日)时间
- Java模块 -- 计算工作日 (Excel导入法定假日至数据库 排除周六 周日 法定假日) Calendar
- 计算工作中请假时间,不计算周六周日
- SQL 计算两日期之间的工作天数和过滤工作日(周六、周日)
- Java 根据指定日期计算所在周的周一和周日
- Java 根据指定日期计算所在周的周一和周日
- 获得本周的周六和周日
- java简易算法+循环版动态日历(包含周六周日和当前日期标识)
- java 求两个日期之间工作日数
- 两日期间的工作日分钟数(只排除了周六周日)
- 创建本年度周六、周日
- 如何判断一个日期是不是周六和周日
- java通过输入工作日数(正或负)得到具体日期或计算两个日期之间的工作日
- java 几个节日 代码计算
- Java实现返回截止今日为止,当月工作日数
- 获取本年的周六周日
- Android 组件BroadcastReceiver(一)
- 一组照片,20岁看不懂,30岁看完沉默,40岁看完流泪
- Inside JVM 学习日志【一】
- Cookie介绍及JavaScript操作Cookie方法详解
- Pandas 选择数据
- Java计算加上指定工作日数(排除周六周日和一系列节日)
- 《Head First 设计模式》例子的C++实现(2 观察者模式)
- 兼容IE7、IE8、IE9的input type="number"插件
- ajax 文件上传带进度条原理
- CString 转char *并且解决中文乱码的问题
- redhat配置网卡配置文件
- Java多线程系列-ConcurrentHashMap
- C++类中使用typedef
- 基于hadoop的网站日志数据分析