跳转至

计划如何被触发?

日历模式

不依赖其他信息,根据当日日期就能直接判断是否符合的

第一种,重复型的

  every: 6-12

第二种,单次型的,在执行之后会删除任务

  on: 2025-8-26

一个快捷方式适用于“每天”

  every: day

支持用列表指定多个日期

  every: [Sat, Sun] # 匹配每周六和周日

需要注意,用 on 时,如 on: [Sat, Sun],匹配任意一个日期,就会把该触发器移除。如果想只删除对应的,可以将 on 作为多个独立的触发器。

  trigger:
  - on: Sat
  - on: Sun

触发器示例

重复型:

  • 每年的 6 月 12 日: every: 6-12
  • 每周三: every: Wednesdayevery: Wedevery: 周三every: 星期三
  • 每月的 15 日: every: 15
  • 八月的每一天: every: Augustevery: Augevery: 八月

单次型:

  • 在 7 月 15 日: on: 7-15
  • 在下次的 5 号: on: 5
  • 在 2025 年 8 月 26 日: on: 2025-8-26 ,其实 every: 2025-8-26 也只会输出一次,不同之处在于它不会自动删除

需要注意的是,如果指定 31 号,但是当月没有这一天,则在月底不会触发,该模式是严格遵守指定的日期的。

农历日期

相比公历,需要在日期前加“农历”二字,如果指定的是闰月,则还需要在最后增加“闰”字

  every: 农历6-12闰

也可以加上空格

  every: 农历 6-12 闰

另外,every 后面还可以跟二十四节气

  every: 立秋

公历重复模式

根据相对描述决定任务日期。

以月和年为周期,以周和天为单位指定日期。

  • 指定起始日期: from: 2025-11-19 ,必须包含年份,如果省略几月,就视作 1 月,如果再省略几号,就视作 1 号。有些情况下,这个参数可以省略,比如每月,每年这种。
  • 指定一个周期:可以是每几天、每几周、每几月、特定月份、每几年,every: 3weekevery: 2monthevery: Juneevery: year
  • 指定某一天,可以用第几天或周几描述,如:第三天 on: 3d、倒数第一天 on: -1daylast: day、第一个星期一 on: Monday、倒数第一个星期五 on: -Frilast: Fri

每月/年的某一天

每月第一个星期一

  every: month
  on: Monday

每月倒数第二天

  every: month
  on: -2d

每月最后一个星期六

  every: month
  last: Sat   # 也可以是,last: 1Sat

每月倒数第二个星期六

  every: month
  last: 2Sat

每个六月的最后一个星期六

  every: June
  last: Sat

每年最后一个星期六

  every: year
  last: Sat

每若干天/周/月/年

没有 on 或 last,会把 from 作为第一天,每经过一次 every 就被触发一次。下面举例说明。

每 16 天一次,会在 2025-8-11、2025-8-27、2025-9-12 ... 触发

  from: 2025-8-11
  every: 16d

每 3 周一次,会在 2025-11-21、2025-12-12 ... 触发

  from: 2025-11-21
  every: 3week

每 2 月一次,会在 2025-11-21、2026-1-21 ... 触发

  from: 2025-11-21
  every: 2month

每 2 年一次,会在 2025-11-21、2027-11-21 ... 触发

  from: 2025-11-21
  every: 2year

如果是一年一次,可以直接用 every: 11-21 实现

需要注意的是,假如 from 是某月的 31 号,下一次的月份可能没有 31 号,此时,会在下一次的月份的最后一天触发,比如 30 号就被触发。

每若干天/周/月/年的某一天

从 2025 年 11 月 21 日起,每三周中的第一周的周三。也就是会在 11 月 19 号(但已经过去)、 12 月 10 号被触发

  from: 2025-11-21
  every: 3week
  on: Wed  # 用 on: 3d 也可以

从 2025 年 8 月起,每两个月中的第一个月的倒数第七天。也就是会在 8 月 25 号、 10 月 25 号被触发

  from: 2025-8
  every: 2month
  last: 7d

从 2025 年开始,每两年中的第一年的第三天运行

  from: 2025
  every: 2year
  on: 3d

这里 from 指定的日期不必精准到天,如果周期是年,到年就行,周期是几天,就精确到天。特殊的是,周期是周的话,可以指定开始周中的任意一天,都将表示那一周。

另外,这里有一个限制,只会从每若干周中的第一周、每若干月中的第一个月这样的,第一个里面去找,如果想要在第二个里面去找,可以更改 from 的日期,调整为从第一个里面去找。

依赖模式

关键词有 if, after 和 before 。if 后面跟 tag ,可以用 and 和 or 指定多个条件。after 和 before 后面跟时长,可以是天或周:2dSat,可以同时使用 after 和 before。


希望计划 B 随计划 A 触发,或者计划 B 在计划 A 之前或之后的某一天被触发,这种关系可以表述为计划 B 的触发依赖计划 A 的触发。

首先,在计划 A 添加一个 tag

- desc: 计划 A
  every: 1-11
  tag: plan_a

要实现同时触发,只需要用 if 跟 tag

- desc: 计划 B
  if: plan_a

计划 A 触发后的第 2 天(1-13)

  if: plan_a
  after: 2d

计划 A 触发前的第 6 天(1-5)

  if: plan_a
  before: 6d

计划 A 触发前的第 1 个星期六(不含当天,1-4)

  if: plan_a
  before: Sat

计划 A 触发前的第 2 个星期六(12-28)

  if: plan_a
  before: 2Sat

如果计划的时间不确定,比如将来支持在下雨天触发,这种情况下,依赖这个计划的其他计划不能保证被触发。

复合模式

如果一个计划有多种触发条件,可以把所有触发器放在一个列表里。

每周六和月末周日触发该计划

- desc: 练习爱好
  trigger:
  - every: Sat
  - every: month
    last: Sun

要注意的是,如果计划里使用了 trigger,就不能再把触发器放在顶层,下面这样是非法的

  every: month
  last: Sun
  trigger:
  - every: Sat

触发器之间的关系

上面是触发器中任意一个满足即会触发,这是“或”关系。

如果需要所有触发模式都满足,也就是“与”关系,可以这样指定。

以“每月最后一日,且该日是周六的情况下”为例:

  trigger:
  - every: month
    last: day
  - every: Sat
  match: all  # 默认值是 any

除了某一天

关键词为 except ,后面跟 tag 和日历模式的内容,支持列表。

当满足 except 时,该计划不会被触发,即便该计划的触发器也有满足的。

后面可以跟 tag 和日历模式的内容。

- desc: 每天,除了周日
  every: day
  except: Sun

延迟执行

关键词为 delay_if ,后面跟 tag 和日历模式的内容,支持列表。

当计划已经被触发,但是 delay_if 同时被满足,那么本次会抑制该计划的触发。该计划会在下一次 delay_if 不满足时立刻执行,并会提示被延期了。

举例说明。如果周六要工作就推迟到明天

  every: Sat
  delay_if: workday   # workday 是一个自定义的 tag