7 个版本
0.2.3 | 2023 年 10 月 1 日 |
---|---|
0.2.2 | 2023 年 2 月 16 日 |
0.1.2 | 2023 年 2 月 3 日 |
#63 在 日期和时间
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();
每年按月日
当指定BYMONTH
和BYMONTHDAY
时,它将只产生与指定月份中的日期匹配的日期。例如,如果你想在每年的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