task scheduled tasks-tasks 任务未执行完下一个会执行吗

Spring定时任务的几种实现
近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合
spring框架来介绍。
从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):
Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
从作业类的继承方式来讲,可以分为两类:
作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。作业类即普通的java类,不需要继承自任何基类。
注:个人推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待。
从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。
二.用法说明
详细介绍每种任务调度工具的使用方式,包括Quartz和spring task两种。
第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。
第一步:定义作业类
Java代码&&
import&org.quartz.JobExecutionC&&
import&org.quartz.JobExecutionE&&
import&org.springframework.scheduling.quartz.QuartzJobB&&
public&class&Job1&extends&QuartzJobBean&{&&
private&int&&&
private&static&int&i&=&0;&&
public&void&setTimeout(int&timeout)&{&&
this.timeout&=&&&
@Override&&
protected&void&executeInternal(JobExecutionContext&context)&&
throws&JobExecutionException&{&&
&&System.out.println(&定时任务执行中…&);&&
&第二步:spring配置文件中配置作业类JobDetailBean
&name=&job1&&class=&org.springframework.scheduling.quartz.JobDetailBean&&&
&name=&jobClass&&value=&com.gy.Job1&&&&
&name=&jobDataAsMap&&&
&key=&timeout&&value=&0&&&&
&说明:org.springframework.scheduling.quartz.JobDetailBean有两个属性,jobClass属性即我们在java代码中定义的任务类,jobDataAsMap属性即该任务类中需要注入的属性值。
第三步:配置作业调度的触发方式(触发器)
Quartz的作业触发器有两种,分别是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
配置方式如下:
&id=&simpleTrigger&&class=&org.springframework.scheduling.quartz.SimpleTriggerBean&&&
&name=&jobDetail&&ref=&job1&&&&
&name=&startDelay&&value=&0&&&&
&name=&repeatInterval&&value=&2000&&&&
第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。
配置方式如下:
&id=&cronTrigger&&class=&org.springframework.scheduling.quartz.CronTriggerBean&&&
&name=&jobDetail&&ref=&job1&&&&
&!—每天12:00运行一次&--&&
&name=&cronExpression&&value=&0&0&12&*&*&?&&&&
&关于cronExpression表达式的语法参见附录。
第四步:配置调度工厂&
&class=&org.springframework.scheduling.quartz.SchedulerFactoryBean&&&
&name=&triggers&&&
&bean=&cronTrigger&&&&
&说明:该参数指定的就是之前配置的触发器的名字。
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器。
第二种,作业类不继承特定基类。
Spring能够支持这种方式,归功于两个类:
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
这两个类分别对应spring支持的两种实现任务调度的方式,即前文提到到java自带的timer task方式和Quartz方式。这里我只写MethodInvokingJobDetailFactoryBean的用法,使用该类的好处是,我们的任务类不再需要继承自任何类,而是普通的pojo。
第一步:编写任务类
Java代码&&
public&class&Job2&{&&
public&void&doJob2()&{&&
System.out.println(&不继承QuartzJobBean方式-调度进行中...&);&&
&可以看出,这就是一个普通的类,并且有一个方法。
第二步:配置作业类
&id=&job2&&&
class=&org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean&&&
&name=&targetObject&&&
&class=&com.gy.Job2&&&&
&name=&targetMethod&&value=&doJob2&&&&
&name=&concurrent&&value=&false&&&&
&说明:这一步是关键步骤,声明一个MethodInvokingJobDetailFactoryBean,有两个关键属性:targetObject指定任务类,targetMethod指定运行的方法。往下的步骤就与方法一相同了,为了完整,同样贴出。
第三步:配置作业调度的触发方式(触发器)
Quartz的作业触发器有两种,分别是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
配置方式如下:
&id=&simpleTrigger&&class=&org.springframework.scheduling.quartz.SimpleTriggerBean&&&
&name=&jobDetail&&ref=&job2&&&&
&name=&startDelay&&value=&0&&&&
&name=&repeatInterval&&value=&2000&&&&
&第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。
配置方式如下:
&id=&cronTrigger&&class=&org.springframework.scheduling.quartz.CronTriggerBean&&&
&name=&jobDetail&&ref=&job2&&&&
&!—每天12:00运行一次&--&&
&name=&cronExpression&&value=&0&0&12&*&*&?&&&&
以上两种调度方式根据实际情况,任选一种即可。
第四步:配置调度工厂&
&class=&org.springframework.scheduling.quartz.SchedulerFactoryBean&&&
&name=&triggers&&&
&bean=&cronTrigger&&&&
说明:该参数指定的就是之前配置的触发器的名字。
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器。
到此,spring中Quartz的基本配置就介绍完了,当然了,使用之前,要导入相应的spring的包与Quartz的包,这些就不消多说了。
其实可以看出Quartz的配置看上去还是挺复杂的,没有办法,因为Quartz其实是个重量级的工具,如果我们只是想简单的执行几个简单的定时任务,有没有更简单的工具,有!
请看我第下文Spring task的介绍。
Spring-Task
上节介绍了在Spring 中使用Quartz,本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种
形式,下面将分别介绍这两种方式。
第一种:配置文件方式
第一步:编写作业类
即普通的pojo,如下:
Java代码&&
import&org.springframework.stereotype.S&&
@Service&&
public&class&TaskJob&{&&
&&&&public&void&job1()&{&&
&&&&&&&&System.out.println(“任务进行中。。。”);&&
&第二步:在spring配置文件头中添加命名空间及描述
&xmlns=&http://www.springframework.org/schema/beans&&&
&&&&xmlns:task=&http://www.springframework.org/schema/task&&&&
&&&&。。。。。。&&
&&&&xsi:schemaLocation=&http://www.springframework.org/schema/task&http://www.springframework.org/schema/task/spring-task-3.0.xsd&&&
&第三步:spring配置文件中设置具体的任务
&&&&&&&&&ref=&taskJob&&method=&job1&&cron=&0&*&*&*&*&?&&&&
&base-package=&&com.gy.mytask&&&&&
说明:ref参数指定的即任务类,method指定的即需要运行的方法,cron及cronExpression表达式,具体写法这里不介绍了,详情见上篇文章附录。
&context:component-scan base-package=&com.gy.mytask& /&这个配置不消多说了,spring扫描注解用的。
到这里配置就完成了,是不是很简单。
第二种:使用注解形式
也许我们不想每写一个任务类还要在xml文件中配置下,我们可以使用注解@Scheduled,我们看看源文件中该注解的定义:
Java代码&&
@Target({java.lang.annotation.ElementType.METHOD,&java.lang.annotation.ElementType.ANNOTATION_TYPE})&&
@Retention(RetentionPolicy.RUNTIME)&&
@Documented&&
public&@interface&Scheduled&&
&&public&abstract&String&cron();&&
&&public&abstract&long&fixedDelay();&&
&&public&abstract&long&fixedRate();&&
&可以看出该注解有三个方法或者叫参数,分别表示的意思是:
cron:指定cron表达式
fixedDelay:官方文档解释:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示从上一个任务完成开始到下一个任务开始的间隔,单位是毫秒。
fixedRate:官方文档解释:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即从上一个任务开始到下一个任务开始的间隔,单位是毫秒。
下面我来配置一下。
第一步:编写pojo
Java代码&&
import&org.springframework.scheduling.annotation.S&&&&
import&org.&&
@Component(“taskJob”)&&
public&class&TaskJob&{&&
&&&&@Scheduled(cron&=&&0&0&3&*&*&?&)&&
&&&&public&void&job1()&{&&
&&&&&&&&System.out.println(“任务进行中。。。”);&&
&第二步:添加task相关的配置:
&version=&1.0&&encoding=&UTF-8&&&
&xmlns=&http://www.springframework.org/schema/beans&&&
&&&&xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&&xmlns:aop=&http://www.springframework.org/schema/aop&&&
&&&&xmlns:context=&http://www.springframework.org/schema/context&&&
&&&&xmlns:tx=&http://www.springframework.org/schema/tx&&&
&&&&xmlns:task=&http://www.springframework.org/schema/task&&&
&&&&xsi:schemaLocation=&&&
&&&&&&&&http://www.springframework.org/schema/beans&http://www.springframework.org/schema/beans/spring-beans-3.0.xsd&&
&&&&&&&&http://www.springframework.org/schema/aop&http://www.springframework.org/schema/aop/spring-aop-3.0.xsd&&
&&&&&&&&http://www.springframework.org/schema/context&&&
http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd&&
&&&&&&&&http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx-3.0.xsd&&
&&&&&&&&http://www.springframework.org/schema/task&http://www.springframework.org/schema/task/spring-task-3.0.xsd&&&
&&&&default-lazy-init=&false&&&
&&&&&!—spring扫描注解的配置&&&--&&
&&&&&base-package=&com.gy.mytask&&&&
&!—开启这个配置,spring才能识别@Scheduled注解&&&--&&
&&&&&scheduler=&qbScheduler&&mode=&proxy&&&
&&&&&id=&qbScheduler&&pool-size=&10&&&
说明:理论上只需要加上&task:annotation-driven /&这句配置就可以了,这些参数都不是必须的。
&Ok配置完毕,当然spring task还有很多参数,我就不一一解释了,具体参考xsd文档http://www.springframework.org/schema/task/spring-task-3.0.xsd。
cronExpression的配置说明,具体使用以及参数请百度google
字段 & 允许值 & 允许的特殊字符
秒 & &0-59 & &, - * /
分 & &0-59 & &, - * /
小时 & &0-23 & &, - * /
日期 & &1-31 & &, - * ? / L W C
月份 & &1-12 或者 JAN-DEC & &, - * /
星期 & &1-7 或者 SUN-SAT & &, - * ? / L C #
年(可选) & &留空,
& &, - * /&
* 通配符 &
? 你不想设置那个字段
下面只例出几个式子
CRON表达式 & &含义&
&0 0 12 * * ?& & &每天中午十二点触发&
&0 15 10 ? * *& & &每天早上10:15触发&
&0 15 10 * * ?& & &每天早上10:15触发&
&0 15 10 * * ? *& & &每天早上10:15触发&
&0 15 10 * * ? 2005& & &2005年的每天早上10:15触发&
&0 * 14 * * ?& & &每天从下午2点开始到2点59分每分钟一次触发&
&0 0/5 14 * * ?& & &每天从下午2点开始到2:55分结束每5分钟一次触发&
&0 0/5 14,18 * * ?& & &每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发&
&0 0-5 14 * * ?& & &每天14:00至14:05每分钟一次触发&
&0 10,44 14 ? 3 WED& & &三月的每周三的14:10和14:44触发&
&0 15 10 ? * MON-FRI& & &每个周一、周二、周三、周四、周五的10:15触发&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:502次
排名:千里之外The page is temporarily unavailable
nginx error!
The page you are looking for is temporarily unavailable.
Please try again later.
Website Administrator
Something has triggered an error on your
This is the default error page for
nginx that is distributed with
It is located
/usr/share/nginx/html/50x.html
You should customize this error page for your own
site or edit the error_page directive in
the nginx configuration file
/etc/nginx/nginx.conf.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&Spring(38)
项目使用的版本比较旧是3.0.6版本,由于需要进行定时任务,就决定使用Spring自带的scheduled
在网上找了很多文章,也查看了Spring3.0.6的官方文档,按照网上和文档所说,可以使用注解或者配置两种方法之一都行,但是我发现单独使用两种方法都不行,怎么配置任务都无法运行。
最后看到一篇文章说两种方法同时用,才成功执行定时任务,可能是个Bug,我试了下,同时使用注解和XML配置后,任务确实成功执行了。
XML配置中,只需要配置一个方法即可,其他方法也能跟着运行了,而且XML中配置的定时时间会被注解覆盖掉,只能先这么做了,期待高手解答原因。
难道真的是Spring3.0.6的Bug??
Spring配置如下:
执行任务的POJO类如下:
对于这个问题,期待高手解答,也希望大家能一起讨论下。
替换成Sping3.2.2之后,就可以直接在XML中配置,而不需要在方法上使用注解配置时间了。
感谢4楼,5楼解答:
问题在于Spring全局配置:default-lazy-init=&true&
加上这一句启动的时候还怎么初始化,如果不想改这个配置,那在bean上加个注解
@Component(&scheduledTaskManager&)&
@Lazy(value=&false&)
public class ScheduledTaskManager {&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:133344次
积分:3032
积分:3032
排名:第8669名
原创:48篇
转载:772篇
(25)(2)(1)(198)(280)(155)(92)(64)(12)(19)(1)4398人阅读
Spring(1)
工作项目总结(2)
Spring内部有一个task是Spring自带的一个设定时间自动任务调度
task使用的时候很方便,但是他能做的东西不如quartz那么的多!
可以使用注解和配置两种方式,配置的方式如下
引入Spring放在appcation.xml开头
&beans xmlns=&http://www.springframework.org/schema/beans&
xmlns:xsi=&http://www.w3.org/2001/XMLSchema-instance&
xmlns:aop=&http://www.springframework.org/schema/aop&
xmlns:context=&http://www.springframework.org/schema/context&
xmlns:task=&http://www.springframework.org/schema/task&
xsi:schemaLocation=&
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd&
default-lazy-init=&true&&
&!--&&注册bean &--&&bean id=&voiceFileClearJob& class=&com.zjr.modules.boss.job.VoiceFileClearJob& /&
&bean id=&versionListenJob& class=&com.zjr.modules.boss.job.VersionListenJob& /&
&bean id=&statJob& class=&com.zjr.modules.opstat.job.StatJob& /&
&!--&&开启任务调度& --&
&task:scheduled-tasks&
&task:scheduled ref=&voiceFileClearJob& method=&execute& initial-delay=&5000& fixed-delay=&3600000&/&
&task:scheduled ref=&versionListenJob& method=&execute& initial-delay=&5000& fixed-delay=&5000&/&
&task:scheduled ref=&statJob& method=&statLgj& cron=&0 59 23 * * ?&/&
&task:scheduled ref=&statJob& method=&statBadNameAndQQ& cron=&23 28 20 * * ?&/&
&/task:scheduled-tasks&
第一个任务表示程序启动5s后调用voiceFileClearJob类中的execute方法,然后每隔一个小时再调用execute一次
第三个任务表示每天的23点59分调用statJob类中的statLgj方法
ref是工作类
method是工作类中要执行的方法
initial-delay是任务第一次被调用前的延时,单位毫秒
fixed-delay是上一个调用完成后再次调用的延时
fixed-rate是上一个调用开始后再次调用的延时(不用等待上一次调用完成)
cron是表达式,表示在什么时候进行任务调度。
以下为上述versionListenJob类的代码,实现的功能是监控某个文件夹,如果该文件夹里面的内容有任何改动,就重新生成一个txt文件,文件记录的是该文件夹所有文件的相关信息。
package com.zjr.modules.boss.
import ...
public class VersionListenJob {
Logger logger = LoggerFactory.getLogger(VersionListenJob.class);
private static final String GMBOSS_DIR = &/data/jweb_static/jweb_wb_mgmt_beta/gmboss/&;
private static final String GMBOSS_VERSION_TXT_FILE = &/data/jweb_static/jweb_wb_mgmt_beta/txt/version.txt&;
private static final String DOWNLOAD_URL = &http://beta./gmboss/&;
private Map&String, String& versionInfoMap = new HashMap&&();
private File dir = new File(GMBOSS_DIR);
private File versionTxt = new File(GMBOSS_VERSION_TXT_FILE);
public VersionListenJob() {
} catch (IOException e) {
logger.error(&error occurs during VersionListenJob&, e);
private void init() throws IOException {
if (!versionTxt.exists())
versionTxt.createNewFile();
for (String line : FileUtils.readLines(versionTxt)) {
String[] array = StringUtils.split(line, &|&);
if (array.length == 5)
versionInfoMap.put(array[0], array[4]);
public void execute() throws IOException {
if (EnvironmentUtil.isLocal() || !dir.exists() || !dir.isDirectory()) {
//是否有文件更新
Boolean needUpdate =
List&File& allFiles = getFiles(dir.getAbsolutePath());
for (File file : allFiles) {
String filePath = file.getPath();
long lastModifiedTime = file.lastModified();
if (!StringUtils.equals(lastModifiedTime + &&, versionInfoMap.get(filePath))) {
needUpdate =
if (needUpdate) {
List&String& list = new ArrayList&&();
for (File file : allFiles) {
list.add(file.getAbsolutePath().replace(GMBOSS_DIR,&/&) + &|&
+ md5(file) + &|&
+ file.getPath().replace(GMBOSS_DIR,DOWNLOAD_URL) + &|&
+ file.length() + &|&
+ file.lastModified());
FileUtils.writeLines(versionTxt,&UTF-8&, list, IOUtils.LINE_SEPARATOR_WINDOWS,false);
(&VersionListenJob: Gmboss has been updated&);
//递归获取目录下的所有文件列表
public List&File& getFiles(String filePath) throws IOException {
List&File& allFiles = new ArrayList&&();
File root = new File(filePath);
File files[] = root.listFiles();
if (files != null && files.length != 0) {
for (File file : files) {
if (file.isDirectory()) {
allFiles.addAll(getFiles(file.getAbsolutePath()));
allFiles.add(file);
return allF
public String md5(File f) {
MessageDigest md =
md = MessageDigest.getInstance(&MD5&);
} catch (NoSuchAlgorithmException ne) {
ne.printStackTrace();
if (md == null)
FileInputStream fis =
fis = new FileInputStream(f);
byte[] buffer = new byte[8192];
while ((length = fis.read(buffer)) != -1) {
md.update(buffer, 0, length);
return new String(Hex.encodeHex(md.digest())).toUpperCase();
} catch (Exception e) {
logger.error(&error occurs during md5 file&, e);
} finally {
if (fis != null)
fis.close();
} catch (IOException e) {
logger.error(&error occurs during md5 file&, e);
cron表达式:
一个cron表达式有至少6个(也可能7个)有空&#26684;分隔的时间元素。
按顺序依次为&
秒(0~59)&
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
其中每个元素可以是一个&#20540;(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于&月份中的日期&和&星期中的日期&这两个元素互斥的,必须要对其中一个设置?.
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? & 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点&
&0 0 12 * * ?& 每天中午12点触发&
&0 15 10 ? * *& 每天上午10:15触发&
&0 15 10 * * ?& 每天上午10:15触发&
&0 15 10 * * ? *& 每天上午10:15触发&
&0 15 10 * * ? 年的每天上午10:15触发&
&0 * 14 * * ?& 在每天下午2点到下午2:59期间的每1分钟触发&
&0 0/5 14 * * ?& 在每天下午2点到下午2:55期间的每5分钟触发&
&0 0/5 14,18 * * ?& 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发&
&0 0-5 14 * * ?& 在每天下午2点到下午2:05期间的每1分钟触发&
&0 10,44 14 ? 3 WED& 每年三月的星期三的下午2:10和2:44触发&
&0 15 10 ? * MON-FRI& 周一至周五的上午10:15触发&
&0 15 10 15 * ?& 每月15日上午10:15触发&
&0 15 10 L * ?& 每月最后一日的上午10:15触发&
&0 15 10 ? * 6L& 每月的最后一个星期五上午10:15触发&
&0 15 10 ? * 6L & 2002年至2005年的每月的最后一个星期五上午10:15触发&
&0 15 10 ? * 6#3& 每月的第三个星期五上午10:15触发
有些子表达式能包含一些范围或列表
例如:子表达式(天(星期) )可以为 “MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”
“*”字符代表所有可能的&#20540;
因此,“*”在子表达式(月 )里表示每个月的含义,“*”在子表达式(天(星期) )表示星期的每一天
“/”字符用来指定数&#20540;的增量
例如:在子表达式(分钟)里的“0/15”表示从第0分钟开始,每15分钟
& & & & &在子表达式(分钟)里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定&#20540;
当2个子表达式其中之一被指定了&#20540;以后,为了避免冲突,需要将另一个子表达式的&#20540;设为“?”
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写
但是它在两个子表达式里的含义是不同的。
在天(月)子表达式中,“L”表示一个月的最后一天
在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT
如果在“L”前有具体的内容,它就具有其他的含义了
例如:“6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五
注意:在使用“L”参数时,不要指定列表或范围,因为这会导致问题
允许&#20540;
允许的特殊字符
, - * ? / L W C&
1-12&或者 JAN-DEC&
1-7&或者 SUN-SAT&
, - * ? / L C #&
年(可选)&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8841次
排名:千里之外
原创:25篇}

我要回帖

更多关于 下一个奇迹 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信