使用java回答有一个00:00:00格式的字符串,当00:00:30表示每30s执行一次,当00:01:30代表每一分半执行一次,当01:01:30表示每一小时多一分钟多30s执行一次,要求只在每天8点到22点运行
时间: 2025-03-10 18:07:56 浏览: 51
<think>嗯,用户的问题是关于如何在Java中处理一个格式为“00:00:00”的字符串,用来表示定时任务的执行间隔,比如“00:00:30”是每30秒一次,“00:01:30”是每1分30秒一次,而“01:01:30”则是每1小时1分30秒一次。同时,任务需要在每天的8点到22点之间运行。
首先,我需要确定如何将字符串解析成时间间隔。字符串是HH:mm:ss格式的,所以应该分割成小时、分钟、秒,然后转换成总秒数。比如,30秒就是30,1分30秒就是90秒,以此类推。这一步应该不难,用split方法分割字符串,然后分别转换各部分为整数,再计算总秒数。
接下来,定时任务的调度。Java中常用的有Timer和ScheduledExecutorService,或者使用Spring的@Scheduled注解,但用户可能希望一个独立的解决方案。可能用ScheduledExecutorService更合适,因为它更灵活且线程池管理更好。
然后,处理每天8点到22点运行的限制。这里需要考虑如何判断当前时间是否在允许的时间范围内。可能需要获取当前时间的小时部分,检查是否在8到22之间。但定时任务可能在非运行时间段被触发,这时候需要跳过执行。或者,可以设置任务只在允许的时间段内调度,但这可能比较复杂,因为间隔可能跨越时间段。例如,如果任务每隔1小时执行一次,可能在8点开始,下一次是9点,但如果在22点之后,就需要停止。
可能需要将任务分为两部分:在允许的时间段内,按照间隔执行;在非时间段内,暂停执行。或者,每次执行任务时检查当前时间是否在允许范围内,如果是则执行,否则跳过。后者可能更简单,但需要考虑任务的调度是否会被延迟影响。例如,如果间隔是30秒,但到了22点之后,任务虽然被触发,但不会执行,直到第二天8点再继续。但这样可能会导致任务在非活跃时间不断被触发但跳过,浪费资源。
或者,可以计算下一次执行的时间,如果下一次执行时间在非活跃时间段,则调整到第二天的8点。这需要更复杂的时间计算。例如,当前时间是21:59:00,间隔是5分钟,那么下一次执行时间是22:04:00,这时候已经超过22点,所以应该推迟到第二天8点执行。但如何实现这个调整呢?
可能需要结合Java的ScheduledExecutorService的scheduleWithFixedDelay或scheduleAtFixedRate方法,但这两个方法可能不够灵活,无法动态调整下一次执行时间。因此,可能需要每次执行任务后,计算下一次的执行时间,并重新调度。例如,使用schedule而不是固定速率或延迟。
这样,每次执行任务后,计算下一次应该执行的时间,如果当前时间在允许的时间段内,则加上间隔;如果不在,则设置到第二天的8点。然后根据这个时间点来调度下一次任务。这需要处理时间的计算,比如当前时间加上间隔后的时间是否在8-22点之间,如果超过22点,就设置为第二天8点加上剩余的时间?或者直接设置为第二天8点?
例如,如果当前执行时间是21:59:30,间隔是30秒,下一次执行时间是21:59:60,即22:00:00,已经超过22点,所以需要推迟到第二天8点执行。但如果间隔是1小时,当前执行时间是21:00:00,下一次是22:00:00,同样超过,需要推迟到第二天8点。
另外,还需要处理当前时间是否在允许时间段内。比如,如果任务启动时是7点,那么第一次执行应该等到8点。或者在启动时立即检查,如果不在时间段内,就安排到8点开始。
所以,可能的步骤是:
1. 解析输入的字符串,转换为总秒数intervalSeconds。
2. 计算初始延迟,即当前时间到下一次允许执行时间的时间差。如果当前时间在8-22点,则初始延迟为0(立即执行)或者间隔时间?或者需要立即执行一次,然后间隔执行?
3. 使用ScheduledExecutorService来调度任务,每次执行后计算下一次时间。
4. 每次执行任务时,检查当前时间是否在允许时间段内,如果是则执行任务,然后计算下一次执行时间;如果不在,则计算下一次执行时间并重新调度。
但这种方法可能比较复杂,因为需要动态调整执行时间。另一种方法是,在允许的时间段内,每隔intervalSeconds秒执行一次,而在非时间段内不执行。但如何确保任务只在时间段内运行?
或者,可以将任务分解为每天在8点启动,然后每隔intervalSeconds秒执行一次,直到22点为止。但如何确保在22点之后停止,并在第二天8点重新启动?
可能需要结合两个定时任务:一个在每天8点启动周期性任务,另一个在每天22点停止该任务。但这种方法需要处理日期的变化,并且可能使用Timer或ScheduledExecutorService来安排每天的启动和停止。
但用户的需求是,当间隔时间跨过22点时,比如任务在21:59执行,间隔时间是2分钟,那么下一次应该在21:61,即22:01,这时候应该停止,并在第二天8点继续。因此,动态调整下一次执行时间可能更合适。
因此,可能的解决方案是:
- 将输入的字符串解析为间隔秒数。
- 每次任务执行时,先检查当前时间是否在8-22点之间,如果是,则执行任务;否则不执行。
- 计算下一次执行的时间:当前时间加上间隔秒数。
- 如果下一次时间在22点之后,则将其设置为第二天8点。
- 使用ScheduledExecutorService的schedule方法来安排下一次执行,根据计算出的延迟时间。
这样,每次执行任务后,都会动态计算下一次的执行时间,并安排下一次调度。这样即使在非活跃时间段,任务也不会执行,直到进入活跃时间段。
现在,如何实现时间计算?可以使用Java 8的LocalDateTime和Duration类来处理日期时间计算。
例如,解析字符串为Duration:
输入的字符串是HH:mm:ss,比如01:01:30表示1小时1分30秒,即3690秒。可以将字符串分割为小时、分钟、秒,然后计算总秒数。
然后,计算下一次执行时间:
当前时间加上间隔秒数,得到nextExecutionTime。如果nextExecutionTime的hour >=22 或者 <8,则需要调整到第二天8点。或者,如果当前时间加上间隔后的日期超过了当天的22点,那么需要调整到第二天的8点。
例如,当前时间是2023-10-10 21:59:00,间隔是5分钟(300秒),那么下一次执行时间是21:59:00 + 5分钟 = 22:04:00,这已经超过22点,所以需要设置为第二天的8:00:00。但这样可能跳过了一些间隔,比如如果间隔是1小时,当前时间是21:00:00,下一次是22:00:00,超过,所以第二天8点执行。但用户可能希望间隔是固定的,不管是否在非活跃时间,所以可能需要累计间隔,但只在活跃时间执行。
或者,是否应该让间隔只在活跃时间段内累计?例如,如果在活跃时间段内,每隔intervalSeconds执行一次,而在非活跃时间段暂停,直到下次活跃时间段再继续。这样,间隔的时间计算需要考虑活跃时间段的中断。
例如,如果间隔是1小时,当前执行时间是21:00:00,那么下一次应该在22:00:00,但此时非活跃,所以推迟到第二天8:00:00。然后,下一次执行在8:00:00 +1小时=9:00:00,依此类推。这样,间隔在非活跃时间段被“压缩”,只计算活跃时间内的间隔。
或者,是否应该保持固定的间隔,无论是否在非活跃时间?比如,任务应该在每1小时执行一次,不管是否在非活跃时间,但只在活跃时间执行。例如,如果任务在21:00执行,下一次应该在22:00,但此时不执行,然后23:00也不执行,直到第二天8:00执行,然后9:00执行。这样,实际间隔变为11小时(从21点到第二天8点)加上1小时到9点,但用户可能希望间隔是固定的,不管是否在非活跃时间。
用户的需求描述中,例子中的时间间隔是固定的,比如“00:01:30”代表每一分半执行一次,而不管是否在非活跃时间。但任务只在每天的8-22点运行。因此,在非活跃时间段,任务不应该执行,但间隔应该继续计算,还是暂停?
例如,假设当前时间是21:59:30,间隔是30秒,那么21:59:30执行,下一次是22:00:00,此时不在活跃时间,所以不执行。然后,22:00:30也不执行,直到第二天8:00:00,这时候是否应该立即执行,还是等到8:00:30(即保持间隔的连续性)?
这取决于用户的需求。用户可能希望任务在活跃时间段内每隔固定间隔执行,而在非活跃时间段暂停,但恢复后继续按照间隔执行。例如,如果间隔是30秒,在8点到22点之间,每30秒执行一次,非活跃时间暂停,22点之后到第二天8点不执行,但8点一到,立即执行一次,然后每30秒继续。
或者,用户可能希望任务在活跃时间段内,每次执行后间隔固定的时间,无论是否在非活跃时间段。例如,如果任务在21:59:30执行,间隔30秒,下一次应该在21:59:60即22:00:00,此时不执行,然后下一次在22:00:30,也不执行,直到第二天8:00:00,这时候是否执行?或者应该从8:00:00开始,重新按照间隔执行?
用户的问题描述中,例子中的时间间隔是固定的,比如“00:01:30代表每一分半执行一次”,因此可能需要将间隔视为固定的,任务在活跃时间段内按照间隔执行,非活跃时间不执行,但间隔的计时不停止。这可能比较复杂,因为需要考虑非活跃时间是否计入间隔。
但根据用户的需求,正确的做法可能是在活跃时间段内,任务每隔intervalSeconds秒执行一次,而在非活跃时间段内,任务不执行,但间隔的时间仍然累计,这样在非活跃时间段过后,任务会继续按照间隔执行。例如,如果间隔是1小时,最后一次执行在21:00,那么下一次应该在22:00(不执行),然后23:00(不执行),第二天0:00(不执行),直到8:00,这时候是否执行?根据间隔累计,8:00距离上一次执行已经过了11小时,所以应该执行多次?这显然不符合用户的需求。
因此,正确的理解应该是,任务只在活跃时间段内按照固定间隔执行,而在非活跃时间段内,任务暂停,不会执行,且间隔的计时也暂停。当活跃时间段再次到来时,任务继续按照间隔执行。例如,每天8点开始,每隔intervalSeconds执行,直到22点停止,第二天重复。
这种情况下,如何实现?可能需要将任务分为每天的8点到22点之间,每隔intervalSeconds执行。可以使用ScheduledExecutorService,在每天8点启动一个固定速率的任务,每隔intervalSeconds执行,然后在22点取消该任务,并安排第二天8点再次启动。
但如何动态处理每天的启动和停止?这可能需要计算每天的8点和22点的时间点,然后安排任务。
例如,可以安排一个任务在每天8点启动周期性任务,然后在22点停止它。这需要计算当前时间到下一个8点和22点的时间差,并安排Timer或ScheduledExecutorService来执行这些操作。
但这可能比较复杂,因为需要处理日期的变更,以及时区的问题。此外,如果服务在非活跃时间段重启,需要确保任务在8点自动启动。
另一种方法是,每次执行任务时,检查当前时间是否在活跃时间段内,如果是则执行,并计算下一次执行时间;如果不在,则计算到第二天8点的时间差,并安排任务在那个时候执行,然后以固定间隔继续。
例如,初始时,计算当前时间是否在8-22点之间:
- 如果是,则立即执行,并计划下一次为当前时间加intervalSeconds。
- 如果否,则计划到第二天8点执行。
然后,每次执行后,计算下一次时间:
- 如果下一次时间在8-22点之间,则安排延迟为intervalSeconds。
- 如果下一次时间超过22点,则计算到第二天8点的时间差,并安排延迟为该时间差。
但这样,在活跃时间段内,任务以固定间隔执行,而在非活跃时间段,任务安排在第二天8点执行。
这样,可以保证任务只在活跃时间段内执行,并且间隔是固定的,不会因为非活跃时间段而累积多次执行。
例如,间隔是30秒:
- 8:00:00 执行
- 8:00:30 执行
- ...
- 21:59:30 执行
- 下一次是22:00:00,超过时间,所以安排到第二天8:00:00
- 第二天8:00:00 执行
- 然后8:00:30,依此类推
这样,任务在每天的8点到22点之间,每隔30秒执行一次,非活跃时间不执行,直到第二天8点继续。
这种方法需要动态计算下一次执行时间,并根据是否在活跃时间段内调整延迟。
现在,如何实现这个逻辑?
步骤:
1. 解析输入的字符串,转换为总秒数intervalSeconds。
2. 创建ScheduledExecutorService。
3. 编写一个Runnable任务,在run方法中执行用户的操作,并安排下一次执行。
4. 在安排下一次执行时,计算当前时间加上intervalSeconds后的时间点nextExecutionTime。
5. 检查nextExecutionTime是否在当天的8点到22点之间:
- 如果是,计算当前时间到nextExecutionTime的延迟,并安排执行。
- 如果否,计算到第二天8点的时间差,并安排执行。
6. 初始时,同样检查当前时间是否在8-22点之间,如果是,立即执行并安排下一次;否则安排到第二天8点。
但需要注意,如果当前时间在活跃时间段内,但加上intervalSeconds后的时间超过了22点,则需要调整到第二天8点。
例如,当前时间是21:59:30,interval是30秒,nextExecutionTime是21:59:60即22:00:00,已经超过,所以需要安排到第二天8点。
具体实现时,可以使用Java的LocalDateTime类来处理日期时间计算。
代码示例:
解析字符串:
String timeStr = "01:01:30";
String[] parts = timeStr.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
int seconds = Integer.parseInt(parts[2]);
long intervalSeconds = hours * 3600 + minutes * 60 + seconds;
然后,计算下一次执行时间:
LocalDateTime now = LocalDateTime.now();
LocalDateTime nextExecution = now.plusSeconds(intervalSeconds);
检查nextExecution是否在当天的活跃时间段内:
LocalDate today = now.toLocalDate();
LocalDateTime startToday = today.atTime(8, 0);
LocalDateTime endToday = today.atTime(22, 0);
如果nextExecution.isAfter(endToday),则计算到第二天8点的时间:
LocalDateTime nextDayStart = today.plusDays(1).atTime(8, 0);
long delay = Duration.between(now, nextDayStart).getSeconds();
否则,计算到nextExecution的延迟:
long delay = Duration.between(now, nextExecution).getSeconds();
然后,使用ScheduledExecutorService的schedule方法,安排任务在delay秒后执行。
但需要考虑初始情况,即当前时间是否在活跃时间段内:
在初始启动时:
LocalDateTime now = LocalDateTime.now();
if (now.isBefore(today.atTime(8, 0))) {
// 安排到今天的8点
delay = Duration.between(now, today.atTime(8, 0)).getSeconds();
} else if (now.isAfter(endToday)) {
// 安排到明天8点
delay = Duration.between(now, today.plusDays(1).atTime(8, 0)).getSeconds();
} else {
// 立即执行,并安排下一次
delay = 0;
}
然后,初始任务安排在delay秒后执行,执行后计算下一次时间。
但这样,初始执行可能需要立即执行,或者等待到8点。
此外,在每次执行任务时,需要捕获异常,避免任务因异常而终止。
综上所述,完整的代码可能如下:
import java.time.*;
import java.util.concurrent.*;
public class ScheduledTask {
private static final int START_HOUR = 8;
private static final int END_HOUR = 22;
private static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
String intervalStr = "00:00:30"; // 示例输入
long intervalSeconds = parseInterval(intervalStr);
scheduleNextExecution(intervalSeconds);
}
private static long parseInterval(String intervalStr) {
String[] parts = intervalStr.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
int seconds = Integer.parseInt(parts[2]);
return hours * 3600L + minutes * 60 + seconds;
}
private static void scheduleNextExecution(long intervalSeconds) {
LocalDateTime now = LocalDateTime.now();
LocalDate today = now.toLocalDate();
LocalDateTime startTime = today.atTime(START_HOUR, 0);
LocalDateTime endTime = today.atTime(END_HOUR, 0);
Runnable task = () -> {
// 执行实际任务逻辑
System.out.println("任务执行于: " + LocalDateTime.now());
// 安排下一次执行
scheduleNextExecution(intervalSeconds);
};
// 计算下一次执行时间
LocalDateTime nextExecutionTime = now.plusSeconds(intervalSeconds);
if (nextExecutionTime.isAfter(endTime)) {
// 超过当天结束时间,安排到明天8点
LocalDateTime nextDayStart = today.plusDays(1).atTime(START_HOUR, 0);
long delay = Duration.between(now, nextDayStart).getSeconds();
scheduler.schedule(task, delay, TimeUnit.SECONDS);
} else {
// 在当天时间内,检查是否在活跃时间段
if (now.isBefore(startTime)) {
// 当前时间早于8点,安排到8点
long delay = Duration.between(now, startTime).getSeconds();
scheduler.schedule(task, delay, TimeUnit.SECONDS);
} else if (now.isAfter(endTime) || now.isEqual(endTime)) {
// 当前时间超过22点,安排到明天8点
LocalDateTime nextDayStart = today.plusDays(1).atTime(START_HOUR, 0);
long delay = Duration.between(now, nextDayStart).getSeconds();
scheduler.schedule(task, delay, TimeUnit.SECONDS);
} else {
// 当前时间在活跃时间段内,安排下一次执行
long delay = intervalSeconds;
scheduler.schedule(task, delay, TimeUnit.SECONDS);
}
}
}
}
不过,这里可能有逻辑错误。例如,在scheduleNextExecution方法中,计算nextExecutionTime时,如果当前时间加上间隔后超过endTime,则安排到第二天8点。但如果在当前时间已经处于活跃时间段内,比如现在是21:59:00,间隔是30秒,那么nextExecutionTime是21:59:30,这在活跃时间内,所以应该安排延迟30秒。但如果当前时间是21:59:30,间隔是30秒,那么nextExecutionTime是22:00:00,超过endTime,所以安排到第二天8点。
另外,在初始调度时,可能需要立即执行任务,如果当前时间在活跃时间段内。例如,当前时间是8:00:00,应该立即执行,然后每隔intervalSeconds执行一次。
但上面的代码中,在scheduleNextExecution中,当当前时间在活跃时间段内时,会安排task在intervalSeconds后执行。但task中的逻辑是执行任务,并再次调用scheduleNextExecution。因此,初始调用scheduleNextExecution可能需要触发第一次执行。
或者,可能需要将task的执行分为两部分:立即执行任务,然后安排下一次;或者在初始调度时,根据当前时间是否在活跃时间段内来决定是否立即执行。
可能需要在初始调度时,检查当前时间是否在活跃时间段内,如果是,立即执行任务,并安排下一次;否则安排到下一个活跃时间点。
例如,修改scheduleNextExecution方法:
private static void scheduleNextExecution(long intervalSeconds) {
LocalDateTime now = LocalDateTime.now();
LocalDate today = now.toLocalDate();
LocalDateTime startTimeToday = today.atTime(START_HOUR, 0);
LocalDateTime endTimeToday = today.atTime(END_HOUR, 0);
// 判断当前时间是否在活跃时间段内
boolean isActive = !now.isBefore(startTimeToday) && now.isBefore(endTimeToday);
if (isActive) {
// 立即执行任务
executeTask();
// 安排下一次执行
scheduleNext(intervalSeconds, now);
} else {
// 计算到下一个活跃时间段的时间
LocalDateTime nextStart = now.isBefore(startTimeToday) ? startTimeToday : today.plusDays(1).atTime(START_HOUR, 0);
long delay = Duration.between(now, nextStart).getSeconds();
scheduler.schedule(() -> {
executeTask();
scheduleNext(intervalSeconds, nextStart);
}, delay, TimeUnit.SECONDS);
}
}
private static void scheduleNext(long intervalSeconds, LocalDateTime lastExecutionTime) {
LocalDateTime nextExecutionTime = lastExecutionTime.plusSeconds(intervalSeconds);
LocalDateTime endTime = lastExecutionTime.toLocalDate().atTime(END_HOUR, 0);
if (nextExecutionTime.isAfter(endTime)) {
// 超过当天结束时间,安排到第二天8点
LocalDateTime nextDayStart = endTime.plusDays(1).withHour(START_HOUR).withMinute(0).withSecond(0);
long delay = Duration.between(LocalDateTime.now(), nextDayStart).getSeconds();
scheduler.schedule(() -> {
executeTask();
scheduleNext(intervalSeconds, nextDayStart);
}, delay, TimeUnit.SECONDS);
} else {
long delay = Duration.between(LocalDateTime.now(), nextExecutionTime).getSeconds();
if (delay < 0) {
delay = 0;
}
scheduler.schedule(() -> {
executeTask();
scheduleNext(intervalSeconds, nextExecutionTime);
}, delay, TimeUnit.SECONDS);
}
}
private static void executeTask() {
System.out.println("任务执行于: " + LocalDateTime.now());
// 实际任务逻辑
}
但这样可能更复杂,需要考虑lastExecutionTime的时间点,并确保间隔的准确性。
最终,正确的实现需要确保每次执行任务后,准确计算下一次执行的时间,无论是当天还是第二天,并且只在活跃时间段内执行。同时,要考虑当前时间可能在任务执行时已经超过了活跃时间段,因此必须重新计算。
总结:
- 解析输入的字符串为总秒数interval。
- 使用ScheduledExecutorService动态安排每次任务。
- 每次执行任务后,计算下一次执行时间,如果超过当天的22点,安排到第二天8点。
- 初始时,检查当前时间是否在8-22点之间,如果是,立即执行并安排下一次;否则安排到下一个8点。</think>以下是分步解决方案:
### 1. 解析时间字符串为秒数
将输入的时间字符串(格式 `HH:mm:ss`)转换为总秒数:
```java
public static long parseIntervalToSeconds(String intervalStr) {
String[] parts = intervalStr.split(":");
int hours = Integer.parseInt(parts[0]);
int minutes = Integer.parseInt(parts[1]);
int seconds = Integer.parseInt(parts[2]);
return hours * 3600L + minutes * 60 + seconds;
}
```
### 2. 核心调度逻辑
使用 `ScheduledExecutorService` 动态计算下一次执行时间,并确保只在8:00-22:00运行:
```java
import java.time.*;
import java.util.concurrent.*;
public class DailyScheduler {
private static final int START_HOUR = 8;
private static final int END_HOUR = 22;
private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void scheduleTask(String intervalStr) {
long intervalSeconds = parseIntervalToSeconds(intervalStr);
scheduler.submit(() -> scheduleNextRun(intervalSeconds, LocalDateTime.now()));
}
private static void scheduleNextRun(long interval, LocalDateTime lastRunTime) {
LocalDateTime now = LocalDateTime.now();
LocalDateTime nextRun = lastRunTime.plusSeconds(interval);
// 判断是否超出当天允许时间范围
if (nextRun.toLocalTime().isAfter(LocalTime.of(END_HOUR, 0))
|| nextRun.toLocalTime().equals(LocalTime.of(END_HOUR, 0))) {
nextRun = nextRun.toLocalDate().plusDays(1)
.atTime(START_HOUR, 0); // 次日8:00
}
// 计算延迟时间
long delay = Duration.between(now, nextRun).getSeconds();
// 提交任务
scheduler.schedule(() -> {
if (isWithinActiveTime(LocalDateTime.now())) {
executeTask(); // 执行实际任务
}
scheduleNextRun(interval, nextRun);
}, delay, TimeUnit.SECONDS);
}
private static boolean isWithinActiveTime(LocalDateTime time) {
return !time.toLocalTime().isBefore(LocalTime.of(START_HOUR, 0))
&& time.toLocalTime().isBefore(LocalTime.of(END_HOUR, 0));
}
private static void executeTask() {
System.out.println("Task executed at: " + LocalDateTime.now());
}
}
```
### 3. 使用示例
```java
public static void main(String[] args) {
DailyScheduler.scheduleTask("00:00:30"); // 每30秒执行一次
}
```
### 关键点说明
1. **动态时间计算**
每次执行后,基于当前时间计算下一次触发时间:
- 若时间在 22:00 后,自动跳转到次日 8:00
- 通过 `Duration` 计算精确延迟
2. **时间段校验**
`isWithinActiveTime()` 方法确保任务仅在 8:00-22:00 执行。
3. **线程池管理**
使用单线程池 `ScheduledExecutorService` 避免资源浪费。
### 测试用例
| 输入时间 | 间隔秒数 | 行为 |
|------------|----------|----------------------------------|
| 00:00:30 | 30 | 每30秒执行一次,每日8:00-22:00运行 |
| 00:01:30 | 90 | 每1分30秒执行一次 |
| 01:01:30 | 3690 | 每1小时1分30秒执行一次 |
此方案通过动态计算确保任务仅在工作时段触发,且间隔时间准确。
阅读全文