Java 如何在给定时间(如上午7:15)安排任务

Java 如何在给定时间(如上午7:15)安排任务,java,schedule,quartz,Java,Schedule,Quartz,所以我想在一个特定的时间安排一个任务,比如早上7点15分,我想执行一次,我想使用Quartz,但它会让任务在每个时间段执行(例如5分钟),但我不想这样,我想基于实时来安排任务。谢谢大家的帮助我在这里找到了答案: CronTrigger示例1-一个表达式,用于创建一个每5分钟触发一次的触发器 “0 0/5***” CronTrigger示例2-一个表达式,用于创建每5分钟在分钟后10秒(即10:00:10 am、10:05:10 am等)触发一次的触发器 “10 0/5***” CronTrigg

所以我想在一个特定的时间安排一个任务,比如早上7点15分,我想执行一次,我想使用Quartz,但它会让任务在每个时间段执行(例如5分钟),但我不想这样,我想基于实时来安排任务。谢谢大家的帮助我在这里找到了答案:

CronTrigger示例1-一个表达式,用于创建一个每5分钟触发一次的触发器

“0 0/5***”

CronTrigger示例2-一个表达式,用于创建每5分钟在分钟后10秒(即10:00:10 am、10:05:10 am等)触发一次的触发器

“10 0/5***”

CronTrigger示例3-用于创建触发器的表达式,该触发器在每周三和周五的10:30、11:30、12:30和13:30触发

0 30 10-13?*星期三、五

CronTrigger示例4-创建触发器的表达式,该触发器在每月5日和20日上午8点到上午10点之间每半小时触发一次。请注意,触发器不会在上午10:00触发,而是在8:00、8:30、9:00和9:30触发

“0 0/30 8-9 5,20*?”


请注意,某些调度要求过于复杂,无法用单个触发器来表示,例如“上午9:00到上午10:00之间每5分钟一次,下午1:00到晚上10:00之间每20分钟一次”。此场景中的解决方案是简单地创建两个触发器,并注册它们以运行相同的作业。

请使用CronTrigger表达式。例如:0 15 07***

一个想执行一次的人

我的一些旧代码触发一次性的计划作业

Calendar cal = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd");
cal.setTime(df.parse(job.getRunatDate()));
cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(job.getRunatHour()));
cal.set(Calendar.MINUTE, Integer.parseInt(job.getRunatMin()));

log.debug ("One-off job at " + cal.getTime());

Trigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger() 
                    .withIdentity("trigger" + job.getLineNumber(), "group1")
                    .startAt(cal.getTime()) 
                     .build();

sched = new StdSchedulerFactory().getScheduler();
sched.start();
sched.scheduleJob(job, trigger);
编辑


正如前面提到的,这是使用非常旧的日期时间类,它被JSR310所取代。使用该选项或

获取所需时区中的当前时刻

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdtNow = ZonedDateTime.now( z ) ;
确定你的目标时间

LocalTime targetTime = LocalTime.of( 7 , 15 ) ;
与当前时间进行比较

LocalTime timeNow = zdtNow.toLocalTime() ;
ZonedDateTime targetZdt = zdtNow.with( targetTime ) ;
if( ! timeNow.isbefore( targetTime ) )
{
    targetZdt = targetZdt.plusDays( 1 ) ;  // Auto-adjusts if this time of day is not valid on that date in that zone. 
}
计算在此之前经过的时间

Duration d = Duration.between( zdtNow , targetZdt ) ;

在持续时间内等待一定时间后,使用Executors框架使用单线程
ScheduledExcutorService
调度可运行任务。搜索堆栈溢出,因为这已被多次讨论

“执行一次”是什么意思?只在明天这个时候,但不在以后?看看我所说的“一次”是指我想执行它一次(不重复)。只执行一次,以后再也不执行?这些糟糕的日期时间类的可能副本在d年前被采用JSR 310的java.time类所取代。@BasilBourque是的,我确实提到过它是旧代码。2014年,如果这是借口的话。你能进一步解释吗?这个“CronTrigger表达式”如何确保任务只运行一次?