java怎么根据用户设定的时间执行定时任务

时间:2023-01-30 07:47:21
大家好,现在有个需求。用户在页面设定时间,在次日的1点执行定时任务。看了Quartz和TimerTask,他们是根据当期时间然后设置一定的时间间隔来定时的执行任务。而现在只想在次日1点执行任务,而且只是执行1次,请问大家有什么好的办法?

8 个解决方案

#1


你可以在不需要的时候销毁任务

#2




// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

#3


     Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 1);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.DAY_OF_MONTH, 1);

        Trigger trigger1 = TriggerBuilder.newTrigger()  
                .withIdentity("trigger2", "group1")  
                .startAt(cal.getTime())  //start time 22:03:59  
//              .endAt(dateOf(22, 04, 59)) //end time 22:04:59  
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()  
                        .withIntervalInSeconds(1)    
                        .repeatForever())  
                        .build();  

#4


     Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 1);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.DAY_OF_MONTH, 1);

        Trigger trigger1 = TriggerBuilder.newTrigger()  
                .withIdentity("trigger2", "group1")  
                .startAt(cal.getTime())  //start time 22:03:59  
//              .endAt(dateOf(22, 04, 59)) //end time 22:04:59  
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()  
                        .withIntervalInSeconds(1)    
                        .repeatForever())  
                        .build();  

#5


引用 2 楼 u011564172 的回复:


// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

请问如果只想执行一次的话怎么做?

#6


引用 5 楼 liangqun2013 的回复:
Quote: 引用 2 楼 u011564172 的回复:



// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

请问如果只想执行一次的话怎么做?

t.schedule(task, // 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
  
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
  
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
  
 Timer t = new Timer();
  
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };
 
 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime);)

#7


引用 5 楼 liangqun2013 的回复:
Quote: 引用 2 楼 u011564172 的回复:



// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));

 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

请问如果只想执行一次的话怎么做?

t.scheduleAtFixedRate(task, startTime);)

#8


quartz是有这个功能的...指定的日期跟时间  执行
 @Scheduled(cron="0 0 8 * * ?")  

#1


你可以在不需要的时候销毁任务

#2




// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

#3


     Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 1);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.DAY_OF_MONTH, 1);

        Trigger trigger1 = TriggerBuilder.newTrigger()  
                .withIdentity("trigger2", "group1")  
                .startAt(cal.getTime())  //start time 22:03:59  
//              .endAt(dateOf(22, 04, 59)) //end time 22:04:59  
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()  
                        .withIntervalInSeconds(1)    
                        .repeatForever())  
                        .build();  

#4


     Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 1);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.MILLISECOND, 0);
        cal.add(Calendar.DAY_OF_MONTH, 1);

        Trigger trigger1 = TriggerBuilder.newTrigger()  
                .withIdentity("trigger2", "group1")  
                .startAt(cal.getTime())  //start time 22:03:59  
//              .endAt(dateOf(22, 04, 59)) //end time 22:04:59  
                .withSchedule(SimpleScheduleBuilder.simpleSchedule()  
                        .withIntervalInSeconds(1)    
                        .repeatForever())  
                        .build();  

#5


引用 2 楼 u011564172 的回复:


// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

请问如果只想执行一次的话怎么做?

#6


引用 5 楼 liangqun2013 的回复:
Quote: 引用 2 楼 u011564172 的回复:



// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

请问如果只想执行一次的话怎么做?

t.schedule(task, // 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
  
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));
  
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
  
 Timer t = new Timer();
  
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };
 
 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime);)

#7


引用 5 楼 liangqun2013 的回复:
Quote: 引用 2 楼 u011564172 的回复:



// 一天的毫秒数
 long daySpan = 24 * 60 * 60 * 1000;
 
 // 规定的每天时间15:33:30运行
 final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '15:33:30'");
 // 首次运行时间
 Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date()));

 
 // 如果今天的已经过了 首次运行时间就改为明天
 if(System.currentTimeMillis() > startTime.getTime())
  startTime = new Date(startTime.getTime() + daySpan);
 
 Timer t = new Timer();
 
 TimerTask task = new TimerTask(){
  @Override
  public void run() {
   // 要执行的代码
   System.err.println("xxxxxxxxx");
  }
 };

 // 以每24小时执行一次
 t.scheduleAtFixedRate(task, startTime, daySpan);

请问如果只想执行一次的话怎么做?

t.scheduleAtFixedRate(task, startTime);)

#8


quartz是有这个功能的...指定的日期跟时间  执行
 @Scheduled(cron="0 0 8 * * ?")