7 个版本

0.2.3 2023 年 10 月 1 日
0.2.2 2023 年 2 月 16 日
0.1.2 2023 年 2 月 3 日

#63日期和时间

MIT 许可证

170KB
4K SLoC

rrules

RRules

一个由 RFC-5545/3-3-10-重复规则.html 标准启发的快速且内存高效的重复规则管理库。它能够定义事件重复规则,然后遍历它们以获取匹配重复规则的日期。

如何使用它

使用此库的最简单方法是从遵循 标准 的字符串中加载重复实例开始

从字符串加载

必需属性
  • FREQ
    • 定义频率类型(例如,DAILY、WEEKLY、MONTHLY 等)
  • INTERVAL
    • 定义频率的间隔(例如,每两天,每三个月等)
  • DTSTART
    • 定义重复的开始日期

示例

// Daily recurrence example:

use std::str::FromStr;
use chrono::{DateTime, Utc};
use rrules::Recurrence;

let recurrence = Recurrence::from_str("FREQ=DAILY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z").unwrap();

// You can then use the `Recurrence` as an iterator by looping over it or collecting the results into a `Vec`

for event in recurrence.clone().take(100) { // cloning to avoid moving the iterator
    // ...
}
// or
let events: Vec<DateTime<Utc>> = recurrence.take(100).collect();

《Recurrence》结构体是一个迭代器,它将产生所有匹配定义的重复规则的日期。

如何使用结构定义使用它

要定义重复规则,首先创建所需的 frequency 规则定义

use chrono::{Duration, Utc};
use rrules::Frequency;
use rrules::Recurrence;

let daily = Frequency::Daily {
    interval: 1,
    by_time: vec![],
};

// Then, create a `Recurrence` with the frequency defined:

let recurrence = Recurrence::new(
    daily,
    Utc::now(), // start date
    Some(Utc::now() + Duration::days(1)), // end date
    Some(Duration::hours(1)), // duration (optional
);

《Recurrence》的 end 属性是可选的,如果没有指定,它将产生事件,直到 MAX_DATE

《MAX_DATE》被定义为 9999-12-31T23:59:59Z

《Recurrence》的 duration 属性是可选的,如果没有指定,它将使用默认值 0 秒 Duration::seconds(0)

属性标准

属性 描述 示例
FREQ 定义频率类型(例如,DAILY、WEEKLY、MONTHLY 等) FREQ=DAILY
INTERVAL 定义频率的间隔(例如,每两天,每三个月等) INTERVAL=2
DTSTART 定义重复的开始日期 DTSTART=2023-01-01T12:00:00Z
DTEND 定义重复的结束日期 DTEND=2023-01-01T12:00:00Z
DURATION 定义重复的持续时间 DURATION=PT1H
BYDAY 定义重复发生的工作日 BYDAY=MO,TU -> 当 FREQ=WEEKLY; BYDAY=1MO,3WE -> 当 FREQ=MONTHLY
BYMONTHDAY 定义重复发生的月份中的天数 BYMONTHDAY=1,2,3,4等
BYMONTH 定义 recurrence 发生的年份中的月份 BYMONTH=1,2,3,4,5,6,7,8,9,10,11,12

支持的 recurrence 规则类型 + 示例

当前支持的 recurrence 规则

其次频率

表示每x秒发生一次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;

let every_second_recurrence = Recurrence::from_str(
    "FREQ=SECONDLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

分钟频率

表示每x分钟发生一次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;

let every_5_minutes = Recurrence::from_str(
    "FREQ=MINUTELY;INTERVAL=5;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

小时频率

表示每x小时发生一次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;

let every_6_hours = Recurrence::from_str(
    "FREQ=HOURLY;INTERVAL=6;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

每日频率

表示每x天发生x次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;

let every_3_days = Recurrence::from_str(
    "FREQ=DAILY;INTERVAL=3;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

let every_day_at_8am = Recurrence::from_str(
    "FREQ=DAILY;INTERVAL=1;DTSTART=2023-01-01T08:00:00Z"
).unwrap();

let every_other_day_at_12pm_and_16pm = Recurrence::from_str(
    "FREQ=DAILY;INTERVAL=2;DTSTART=2023-01-01T00:00:00Z;BYTIME=12:00,16:00"
).unwrap();

每周频率

表示每x周发生x次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;

let every_week = Recurrence::from_str(
    "FREQ=WEEKLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

let every_week_mon_and_tue = Recurrence::from_str(
    "FREQ=WEEKLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z;BYDAY=MO,TU"
).unwrap();

每月频率

表示每x月发生x次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;
let monthly = Recurrence::from_str(
    "FREQ=MONTHLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

按月日

当指定BYMONTHDAY时,它将只产生与指定月份中的日期匹配的日期。

use std::str::FromStr;
use rrules::Recurrence;
let every_15th = Recurrence::from_str(
    "FREQ=MONTHLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z;BYMONTHDAY=15"
).unwrap();

let every_15th_and_25th = Recurrence::from_str(
    "FREQ=MONTHLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z;BYMONTHDAY=15,25"
).unwrap();

按第n天

当指定BYDAY时,它将只产生与指定星期几的第n天匹配的日期。例如,如果你想在每月的第一个星期一有 recurrence,你可以这样做

use std::str::FromStr;
use rrules::Recurrence;
let every_first_monday = Recurrence::from_str(
    "FREQ=MONTHLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z;BYDAY=1MO"
).unwrap();

let every_first_monday_and_wednesday = Recurrence::from_str(
    "FREQ=MONTHLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z;BYDAY=1MO,1WE"
).unwrap();

每年频率

表示每x年发生x次的 recurrence 规则。

use std::str::FromStr;
use rrules::Recurrence;
let yearly = Recurrence::from_str(
    "FREQ=YEARLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z"
).unwrap();

每年按月日

当指定BYMONTHBYMONTHDAY时,它将只产生与指定月份中的日期匹配的日期。例如,如果你想在每年的1月15日有 recurrence,你可以这样做

use std::str::FromStr;
use rrules::Recurrence;
let every_15th_january = Recurrence::from_str(
    "FREQ=YEARLY;INTERVAL=1;DTSTART=2023-01-01T12:00:00Z;BYMONTH=1;BYMONTHDAY=15"
).unwrap();

许可证:MIT

依赖关系

~3–4.5MB
~72K SLoC