25个版本

0.9.0 2024年2月20日
0.8.1 2023年11月13日
0.8.0 2023年4月8日
0.7.11 2023年3月13日
0.7.0 2019年11月19日

#206解析器实现

Download history 406/week @ 2024-04-23 367/week @ 2024-04-30 407/week @ 2024-05-07 271/week @ 2024-05-14 188/week @ 2024-05-21 413/week @ 2024-05-28 283/week @ 2024-06-04 213/week @ 2024-06-11 255/week @ 2024-06-18 195/week @ 2024-06-25 193/week @ 2024-07-02 224/week @ 2024-07-09 253/week @ 2024-07-16 307/week @ 2024-07-23 225/week @ 2024-07-30 177/week @ 2024-08-06

988 每月下载量
127 直接crate中使用

BSD-3-Clause

16KB
182

cron解析器

crates.io Test docs

支持时区的cron表达式解析库。

示例

use chrono::{TimeZone, Utc};
use chrono_tz::Europe::Lisbon;
use cron_parser::parse;

fn main() {
   if let Ok(next) = parse("*/5 * * * *", &Utc::now()) {
        println!("when: {}", next);
   }

   // passing a custom timestamp
   if let Ok(next) = parse("0 0 29 2 *", &Utc.timestamp(1893456000, 0)) {
        println!("next leap year: {}", next);
        assert_eq!(next.timestamp(), 1961625600);
   }

   assert!(parse("2-3,9,*/15,1-8,11,9,4,5 * * * *", &Utc::now()).is_ok());
   assert!(parse("* * * * */Fri", &Utc::now()).is_err());

   // use custom timezone
   assert!(parse("*/5 * * * *", &Utc::now().with_timezone(&Lisbon)).is_ok());
}

cron表

# ┌─────────────────────  minute (0 - 59)
# │ ┌───────────────────  hour   (0 - 23)
# │ │ ┌─────────────────  dom    (1 - 31) day of month
# │ │ │ ┌───────────────  month  (1 - 12)
# │ │ │ │ ┌─────────────  dow    (0 - 6 or Sun - Sat)  day of week (Sunday to Saturday)
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>
字段 必需 允许的值 允许的特殊字符
分钟 0–59 * , - /
小时 0–23 * , - /
月份中的某天 1–31 * , - /
月份 1–12 * , - /
星期中的某天 0–6 或 Sun-Sat * , - /

对于星期中的某天,当使用Weekday (Sun-Sat)时,不支持表达式*/Day,而是使用整数,原因是以例如*/Wed = */3为例,它表示每3天运行一次,这意味着周日、周三、周六。

  • *任何值
  • ,值列表分隔符
  • -值范围
  • /步长值

依赖于crate chrono

示例Cargo.toml

[dependencies]
chrono = "^0.4"
cron-parser = "*"

获取下一个10个闰年的迭代

use chrono::{DateTime, Utc};
use cron_parser::parse;

fn main() {
    let now = Utc::now();
    let mut crons = Vec::<DateTime<Utc>>::new();
    let mut next = parse("0 0 29 2 *", &now).unwrap();
    for _ in 0..10 {
        next = parse("0 0 29 2 *", &next).unwrap();
        crons.push(next);
    }
    for x in crons {
        println!("{} - {}", x, x.timestamp());
    }
}

它将打印类似的内容

2024-02-29 00:00:00 UTC - 1709164800
2028-02-29 00:00:00 UTC - 1835395200
2032-02-29 00:00:00 UTC - 1961625600
2036-02-29 00:00:00 UTC - 2087856000
2040-02-29 00:00:00 UTC - 2214086400
2044-02-29 00:00:00 UTC - 2340316800
2048-02-29 00:00:00 UTC - 2466547200
2052-02-29 00:00:00 UTC - 2592777600
2056-02-29 00:00:00 UTC - 2719008000
2060-02-29 00:00:00 UTC - 2845238400

依赖关系

~1MB
~18K SLoC