java 定时 spring_Java Spring定时器Demo, 可自动跳过节假日

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> data = testData(); //测试数据

for(Map 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 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 map){ //模拟更新

return 1;

}

private List> testData(){ //模拟数据

List> list = new ArrayList>();

Map map = new HashMap();

for(int i=0;i<10;i++){

map = new HashMap();

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()));

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值