package com.test.task; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component("myTask") public class myTask { @Scheduled(cron = "0 0 * * * ?") //每小时执行一次 public void firstTime() throws Exception { Calendar calendar = Calendar.getInstance(); Date currentStartTime = calendar.getTime(); if(isWorkday(currentStartTime)){ List<Map<String,Object>> data = testData(); //测试数据 for(Map<String,Object> map : data){ map.put("state", "1"); update(map); //更新操作 } } } /** * 计算是否超过h小时 */ private boolean overtime(Date oldDate, int h){ long maxSeconds = h * 60 * 60; //秒数 Calendar calendar = Calendar.getInstance(); Date today = calendar.getTime(); long now = calendar.getTimeInMillis()/1000; calendar.clear(); calendar.setTime(oldDate); long old = calendar.getTimeInMillis()/1000; int num = countPlayday(oldDate,today); //计算期间休息的天数 int playdaySeconds = num * 24 * 60 * 60; //休息天总秒数 //公式: 现在日期转换总分钟数 - 过去日期转换总分钟数 - 此期间休息天的分钟数 >= 参数h小时的分钟数 if(now/60 - old/60 - playdaySeconds/60 >= maxSeconds/60){ //精确到分,如果精确到秒去掉除60 return true; } return false; } /** * 判断是否是工作日 * true:工作日 false:休息日 * 与"休息日列表"有关,该列表所示日期区间必须涵盖本参数date * @param date */ private boolean isWorkday(Date date){ String yyyyMMdd = new SimpleDateFormat("yyyyMMdd").format(date); return !playdayCalendar().contains(yyyyMMdd); } /** * 计算时间段内有几天休息天 * 与"休息日列表"有关,该列表必须涵盖此时间段 begin ~ end * @param begin * @param end */ private int countPlayday(Date begin, Date end){ int num = 0; Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.setTime(begin); long beginMillis = calendar.getTimeInMillis(); calendar.setTime(end); long endMillis = calendar.getTimeInMillis(); if(beginMillis <= endMillis){ long millis = beginMillis; long onedayMillis = 24 * 60 * 60 * 1000; //1天的毫秒数 while(true){ calendar.setTimeInMillis(millis); if(!isWorkday(calendar.getTime())){ //非工作日 num ++; } millis = millis + onedayMillis; //下一天 if(millis/(60*1000) > endMillis/(60*1000)){ //精确到分 break; } } } return num; } /** * 休息日列表,按月份列出 * 格式:yyyyMMdd */ private List<String> playdayCalendar(){ String[] playdays = { /**三月*/ "20150301", "20150307","20150308","20150314","20150315", "20150321","20150322","20150328","20150329", /**四月*/ "20150404","20150405","20150406", "20150411","20150412","20150418","20150419", "20150425","20150426", /**五月*/ "20150501","20150502","20150503", "20150509","20150510","20150516","20150517", "20150523","20150524","20150530","20150531", /**六月*/ "20150606","20150607","20150613","20150614", "20150620","20150621","20150622", "20150627","20150628" }; return Arrays.asList(playdays); } /** * 对象转Integer */ private Integer parseInt(Object obj){ try { return Integer.parseInt(obj.toString()); } catch (Exception e) { return -100; } } //=========下面测试方法===================================== private String format(Date date){ SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return df.format(date); } private Date parse(String str){ Date date = null; SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { date = df.parse(str); } catch (ParseException e) { } return date; } private int update(Map<String,Object> map){ //模拟更新 return 1; } private List<Map<String,Object>> testData(){ //模拟数据 List<Map<String,Object>> list = new ArrayList<Map<String,Object>>(); Map<String,Object> map = new HashMap<String,Object>(); for(int i=0;i<10;i++){ map = new HashMap<String,Object>(); list.add(map); } return list; } public static void main(String[] args) { myTask t = new myTask(); // System.out.println(t.format(new Date())); // System.out.println(t.parse("2015-3-10 12:12:59")); Calendar calendar = Calendar.getInstance(); // calendar.set(calendar.HOUR_OF_DAY, 17); System.out.println(t.format(calendar.getTime())); calendar.set(calendar.MONTH, 3); //4月份 calendar.set(calendar.DAY_OF_MONTH, 25); // System.out.println(t.overtime(calendar.getTime(), 24));; // System.out.println(t.isWorkday(calendar.getTime()));; System.out.println(t.countPlayday(new Date(),calendar.getTime())); } }
最近下载更多
nulixuexiing LV4
2023年8月31日
kobemvp60 LV2
2022年6月22日
哇哦好代码 LV1
2022年1月15日
wasd1624081287 LV3
2021年11月14日
LikH. LV2
2021年5月31日
风兮水文天下 LV3
2021年5月28日
老干妈说她13香 LV1
2021年1月2日
xluser LV2
2020年9月29日
kfq33122 LV4
2020年9月9日
baihongdoudou LV5
2020年8月20日
最近浏览更多
nulixuexiing LV4
2023年8月31日
马克思
2022年12月5日
暂无贡献等级
dawang LV2
2022年8月23日
kobemvp60 LV2
2022年6月22日
npc也有忧伤 LV3
2022年3月27日
哇哦好代码 LV1
2022年1月15日
Hachi6 LV13
2021年12月21日
lyws1986 LV17
2021年12月16日
wasd1624081287 LV3
2021年11月14日
w1073378859
2021年9月17日
暂无贡献等级